SetParameterで変更した Param が即時セーブされない件について

39 views
Skip to first unread message

菲特茶 FateTea

unread,
Jan 13, 2026, 2:54:50 AMJan 13
to 宴ユーザーグループ
Utage Ver 4.0.7
UnityのバージョンとOS: Unity2021.3.45.f2 Windows
Unityの習熟度:中級者。プログラムはできます。


お世話になっております。

現在、Unityで Utageを使用していますが、Paramの保存挙動についていくつか不明点があり、ご質問させていただきます。

Utageの会話再生中に、外部のScriptから
advEngine.Param.TrySetParameter(key, parameter);
を呼び出して Param を変更した場合、
新しいセリフを読み込まずにそのままセーブを行い、そのセーブデータをロードすると、TrySetParameter で設定した Param が保存されていません。
しかし、次のセリフへ進んだ後にセーブを行うと、変更された Param は正しく保存されます。


また、上記と似た挙動として、
ParameterViewer を使用して Param を変更し、すぐにセーブ → ロードを行った場合も、変更した Param が保存されません。
ただし、次のセリフを読み込んだ後であれば、Param は正しく保存されます。

この挙動について、AdvParamManager や AdvSaveManager などのクラスを確認しましたが、外部 Script から 現在の Param を手動で更新・確定させるための適切な API が見当たりませんでした。

質問ですが、
外部 Script から Param を変更した後、「次のセリフへ進まなくても」その Param をセーブ対象として確定させるための正しい方法や API はありますでしょうか?
もし内部的にセーブ対象へ反映するために呼び出すべき処理があれば、ご教示いただけますと幸いです。

マッドネスラボ

unread,
Jan 13, 2026, 4:44:55 AMJan 13
to 宴ユーザーグループ
仕様次第によるのですが、一番簡単なのはパラメーターをシステムセーブデータのほうを使うことです。
システムセーブデータは基本的に、常に現在の状態でセーブロードをします。

セーブデータごとに固有のパラメーターに関して即時ではないのは仕様です。
いったん、宴のセーブシステムの仕組みをお伝えします。
基本はこの状態です。
>All Page : 全てのページでセーブ可能にします。ロード時は各ページの先頭から再開されます。デフォルトのセーブです。
具体的な挙動は次のようになります。
・「ページの冒頭の状態(最後の改ページの直後の状態)」をメモリ上(SaveManagerコンポーネントのAutoSaveData)に記録しておく。
・セーブファイルに書き込む時点で、メモリ上に記録した状態を書き込む
・セーブファイルをロード時には、ページの冒頭から再現したのちそのページのコマンドを順次実行する

こういった仕組みになっているため、現在の状態をそのままセーブしてしまうと再開時にそのページのコマンドを実行したときに次のようなことが起きます。
たとえば、セーブしたページで「パラメーターを+1させるコマンド」があった場合、現在の状態(+1した状態)でセーブしてしまうと、
再開した時点でセーブデータ内は+1されているいっぽう、「パラメーターを+1させるコマンド」も再び実行されます。
これはパラメーターに限った話ではなく、たとえばキャラクターの位置や色など、全てにおいて同じことが起きます。

それらのリスクを踏まえたうえで、プログラムから強制的にセーブデータを即時(現在の状態)にするのは、
ファイルに書き込み前に、SaveManagerコンポーネントのAutoSaveDataを更新する必要があります。
サンプル
public class Sample : MonoBehaviour
{
public AdvEngine advEngine;

public void ForceUpdateSave()
{
advEngine.SaveManager.UpdateAutoSaveData(advEngine);
}
}

ただ、これだとパラメーター以外のキャラクターの位置や色にも影響してしまうため
パラメーターのみ更新するのであれば、宴のソースコードを更新してAutoSaveDataの中身の一部のみ更新するプログラムを追加する必要があります。
必要であれば作成しますので、ご連絡ください。



2026年1月13日火曜日 16:54:50 UTC+9 菲特茶 FateTea:

菲特茶 FateTea

unread,
Jan 13, 2026, 6:44:04 AMJan 13
to 宴ユーザーグループ
ご説明ありがとうございます。
ご指摘いただいた内容で、使用上のリスクについては概ね理解できました。

実際にadvEngine.SaveManager.UpdateAutoSaveData(advEngine);を試してみたのですが、
セーブ位置が Selection の途中であった場合、同じ選択肢が再度表示されてしまう挙動を確認しました。

図Aは X・Y の位置移動を含む Selection ですが、その状態でセーブし、ロードすると、同じ Selection が再度表示されてしまいます(図B)。
20260113_001.jpg
この挙動が、UpdateAutoSaveData を使用する場合に別途考慮・対処すべき仕様なのかどうかが分かっていません。

また、ご説明いただいた「パラメーターを +1 させるコマンド」の例から考えると、
advEngine.SaveManager.UpdateAutoSaveData(advEngine); を使用する方法にも、やはり一定のリスクがあるように感じています。

現在、私は主に SendMessage を使用して、自作の UI からプレイヤーが操作し、Utage のパラメーターを変更する仕組みを作っていますが、プレイヤーがそのタイミングでセーブした場合、パラメーターが正しく保存されない可能性がある点を懸念しています。

もし、パラメーターのみを更新し、セーブ時に正しく保存できる仕組みや機能、またはそのための実装例をご提供いただけるようでしたら、大変ありがたく存じます。

マッドネスラボ 在 2026年1月13日 星期二下午5:44:55 [UTC+8] 的信中寫道:

マッドネスラボ

unread,
Jan 13, 2026, 9:15:04 AMJan 13
to 宴ユーザーグループ
>セーブ位置が Selection の途中であった場合、同じ選択肢が再度表示されてしまう挙動を確認しました。
これは、先ほどの説明にあったこの状態です。全てというのは、キャラの位置や色に限らずセーブデータの対象になっている全てのオブジェクトです。
>これはパラメーターに限った話ではなく、たとえばキャラクターの位置や色など、全てにおいて同じことが起きます。

セーブデータを即時更新したセーブデータであっても、再開時にはページの冒頭からコマンドを実行しなおすので、
コマンドのあるページ内でそのメソッドを呼ぶと、重複して実行されて正常に動作しないコマンドは全て正常に動作しないと思います。
即時更新のプログラムを呼ぶなら、何もコマンドがないページで使用するしかないと思います。


>もし、パラメーターのみを更新し、セーブ時に正しく保存できる仕組みや機能、またはそのための実装例をご提供いただけるようでしたら、大変ありがたく存じます。

承知しました。プログラムを 更新したので添付のパッケージファイルをインポートしてください。
(unitypackageの使い方などの詳細はこちらをご確認ください)

セーブデータ用のクラスにWriteParamというパラメーターのバッファのみを即時上書き更新するメソッドを追加しました。
次のようにして使用してみてください。
public class Sample : MonoBehaviour
{
public AdvEngine advEngine;

public void UpdateAutoSaveParamOnly()
{
advEngine.SaveManager.AutoSaveData.WriteParam(advEngine.Param);
}
}

パラメーター以外のセーブデータは通常通りになります。
ただし、実行したページ内にParamコマンドなどパラメーター操作コマンドがある場合、

セーブ前の流れ
・Paramコマンド実行
・WriteParamメソッドによってパラメーターのみセーブデータに上書き
・セーブファイル書き込み
ロード後の流れ
・セーブファイルをロード
・セーブデータからParamコマンド実行後のパラメーターの内容が読み込まれる
・ページの冒頭からコマンド再開されていく
・Paramコマンドが再び実行される
となり、Paramコマンドが実質重複して実行されるので注意してください。


2026年1月13日火曜日 20:44:04 UTC+9 菲特茶 FateTea:
WriteParamOnly.unitypackage
Message has been deleted

菲特茶 FateTea

unread,
Jan 13, 2026, 12:22:36 PMJan 13
to 宴ユーザーグループ
unitypackage をご提供いただき、誠にありがとうございます!

早速試してみたのですが、
advEngine.SaveManager.AutoSaveData.WriteParam(advEngine.Param);
を使用した場合、私の環境では正しく動作しないようでした。

一方で、
advEngine.SaveManager.CurrentAutoSaveData.WriteParam(advEngine.Param);
を使用すると、想定していた挙動どおりにパラメーターが反映されることを確認しています。

この 2 つの違いについて、何か仕様上の差異はありますでしょうか?

私のほうのセーブ関連設定や、他のコードの影響の可能性も考えられるため、
環境依存の問題であればご容赦ください。

もし CurrentAutoSaveData を使用する方法が正しいのであれば、
その方法で対応しようと考えていますが、将来的に別の問題が発生しないか少し懸念しています。

ご教示いただけますと幸いです。

マッドネスラボ 在 2026年1月13日 星期二晚上10:15:04 [UTC+8] 的信中寫道:

マッドネスラボ

unread,
Jan 13, 2026, 12:57:54 PMJan 13
to 宴ユーザーグループ
すみません。サンプルコードが間違ってました
ご指摘の通り、CurrentAutoSaveDataのほうが正解です。

public class Sample : MonoBehaviour
{
public AdvEngine advEngine;

public void UpdateAutoSaveParamOnly()
{
advEngine.SaveManager.CurrentAutoSaveData.WriteParam(advEngine.Param);
}
}



2026年1月14日水曜日 2:22:36 UTC+9 菲特茶 FateTea:

菲特茶 FateTea

unread,
Jan 13, 2026, 4:00:35 PMJan 13
to 宴ユーザーグループ
ご対応いただき、ありがとうございます。
おかげさまで問題は解決しました。
ありがとうございました。

マッドネスラボ 在 2026年1月14日 星期三凌晨1:57:54 [UTC+8] 的信中寫道:
Reply all
Reply to author
Forward
0 new messages