Unity側で独自に用意したUIオブジェクト位置を変更し、その内容を宴のセーブロードの対象にする方法について

169 views
Skip to first unread message

Y Y

unread,
Mar 9, 2024, 10:54:07 AM3/9/24
to 宴ユーザーグループ
マッドネスラボさま

お世話になります。

表題の件ですが、SendMessageのページを参照し、
独自に用意したUnity側のUIオブジェクト位置を変更するという実装をしております。
https://madnesslabo.net/utage/?page_id=1823

こちら、UI位置の変更については成功しておりますが、
上記の解説ページに記載の
「この機能で独自のオブジェクトを表示するなどしても、ロード後には消えてしまいます」
の通り、ロード後には位置が元の状態に戻ってしまいます。

こちらの問題について、ご無理なご相談かもしれませんが、
実現したいことに対する何らかの対応方法などをご教示いただくことはできないでしょうか?

▼実現したいこと
・宴のシナリオ上で、特定のタイミングにおいて、Unity側で独自に用意したUIの位置変更を行う
・変更されたUI位置を、宴のセーブロード機能に反映し、ロードした場合でも変更されたUI位置を保つ

以上、大変お手数ですが、ご確認いただけますと幸いです。

宴のバージョン:宴3.12.8
UnityのバージョンとOS:Unity2021.3.1f1 Windows10
Unityの習熟度:初心者

マッドネスラボ

unread,
Mar 9, 2024, 4:00:19 PM3/9/24
to 宴ユーザーグループ
UIの位置を変更するのであれば、
GuiPositionコマンドを使えば場所もセーブデータに記録されます。

それと、裏技のようなものなのですが、
Gui操作系コマンドの準備として使用するAdvGuiManagerに設定したUIは
宴の管理対象とのUIとして、「RectTransformの値(位置やサイズなど)」、「アクティブのオンオフ」がセーブ対象になるので
GuiPositionコマンドではなく、SendMessage経由でプログラムから変更してもセーブデータに変更が反映されると思います。





2024年3月10日日曜日 0:54:07 UTC+9 Y Y:

Y Y

unread,
Mar 11, 2024, 6:27:44 PM3/11/24
to 宴ユーザーグループ
ご丁寧にご回答ありがとうございます。
裏技の方の設定方法についても、大変助かります。

どちらも試してみようと思います。
ありがとうございました。

2024年3月10日日曜日 6:00:19 UTC+9 マッドネスラボ:

Y Y

unread,
Mar 11, 2024, 7:47:24 PM3/11/24
to 宴ユーザーグループ
マッドネスラボさま

お世話になります。
GuiPosition にてUI位置の変更、およびセーブデータにUI位置が保存できることを確認いたしました。
ありがとうございました。

こちら、前回のご質問させていただいた際の説明不足で申し訳ございませんが、
下記が詳細な【実現したいこと】になります。

ーーーー
▼実現したいこと
①宴のメインシナリオ上で、プレイヤー任意タイミングでボタンを押して、サブシナリオを呼び出す
 ⇒サブシナリオが呼び出されると、サブシナリオ用のUI位置に変更される
 (現状は、サブシナリオ上で、SendMessage もしくは GuiPosition にて変更してます)
  ※このサブシナリオは、ゲーム用途上での「メニュー」のようなものです

②サブシナリオから、プレイヤー任意タイミングでボタンを押して、元のメインシナリオに戻る
 ⇒メインシナリオが呼び出されると、メインシナリオ用のUI位置に変更される
 (現状は、サブシナリオ上で、SendMessage もしくは GuiPosition にて、
  メインシナリオ用のUIに変更してから メインシナリオに戻るための EndScenario コマンドをしてます)

・変更されたUI位置を、宴のセーブロード機能に反映し、ロードした場合でも変更されたUI位置を保つ

※補足※
メインシナリオからサブシナリオの呼び出しが、プレイヤー任意タイミングでボタンを押した時のため
サブシナリオからメインシナリオに戻る直前に、メインシナリオ用のUI位置変更のコマンドを設定しております。

ーーーー

上記において、
①のサブシナリオ用のUI位置の変更まではうまくいくのですが、
②のサブシナリオからメインシナリオ用のUI位置の変更が、適用されません。
※サブシナリオで変更したUI位置が、メインシナリオに引き継がれないことが問題かと思われます。

こちら、大変お手数ですが、【実現したいこと】に対する解決方法はありますでしょうか?

当初のご質問の趣旨から少しずれてきてしまい、申し訳ございませんが、ご確認をお願いいたします。

2024年3月12日火曜日 7:27:44 UTC+9 Y Y:

マッドネスラボ

unread,
Mar 12, 2024, 8:54:47 AM3/12/24
to 宴ユーザーグループ
すみません、先日の返信で
>GuiPositionコマンドではなく、SendMessage経由でプログラムから変更してもセーブデータに変更が反映されると思います。
とお伝えしたのですが、
Gui系コマンドを経由しないと、「UIが変化した」というフラグが立たないため、セーブデータで正しく扱えないです。

また、それとは別に
>※サブシナリオで変更したUI位置が、メインシナリオに引き継がれないことが問題かと思われます。
それ自体は仕様です。
サブシナリオは一時的な再生をするだけで、再生が終わったら元のシナリオの状態に戻すためにあるものです。

サブシナリオの仕組みは
「いったんメインシナリオの状態をセーブする」
→「サブシナリオを再生する」
→「メインシナリオにもどったときに、セーブしておいたメインシナリオの状態を読むこむ」
というものです。

サブシナリオ自体がセーブデータをかなり例外的に扱った特殊な処理で、
さらにそこから機能の一部だけ継続するというのは、例外中の例外という処理になります。

サンプルコードの以下の部分で、パラメーターだけは次のような処理で、継続性を持たせるようにしています。

    //再開用のセーブデータのロード直後の処理
    void OnBeginReadSaveData(AdvScenarioPlayer player)
    {
        //シナリオ再開前にパラメーターだけ、サブシナリオで変化したものに戻す
        BinaryUtil.BinaryRead(BufferParam, (reader) => AdvEngine.Param.Read(reader, AdvParamData.FileType.Default));
        AdvEngine.ScenarioPlayer.OnBeginReadSaveData.RemoveListener(OnBeginReadSaveData);
    }

同じ要領で、サブシナリオ中のUI配置を記録して元に戻すということもできなくはないのですが、
サブシナリオの終了と同時に、UI配置にリセット処理がかかるので、このサンプルコードではタイミングが間に合わないため、別の処理が必要になります。
(サブシナリオの場合、基本的には再生前後でシナリオに対してリセットやセーブデータのロード処理をかけるので、UI配置もリセットされてデフォルトに戻るという処理も混ざります)
サンプルコードにある、
       AdvEngine.ClearOnEnd();
などのほかに、EndScenarioコマンドが呼ばれたときなどに呼び出されるケースもあります。

上記のようにかなり不安定になってしまうので、サブシナリオを使うのであれば、AdvGuiManagerを使わずに、独自にUI変更のセーブ処理をプログラム制御したほうがいいと思います。
こちらを参考に、独自のUI制御とそのセーブ処理をプログラムで書いてみてください。

セーブデータのOnClearやOnWrite、OnReadはサブシナリオの再生前後でも呼ばれてしまうので、
サブシナリオ中かどうかのフラグを立てるなどして、サブシナリオ中はそれらを行わないなどをして制御してみてください。

また、宴は設計当初にUnityにJsonの仕組みがなかったため、バイナリでセーブデータを読み書きしていますが、
バイナリの操作が難しいようであれば、Jsonを使って文字列のセーブデータを作って、Json文字列をバイナリで読み書きするという形にすれば、Jsonを使ったプログラムも書きやすくなると思います。

2024年3月12日火曜日 8:47:24 UTC+9 Y Y:

Y Y

unread,
Mar 12, 2024, 10:06:25 AM3/12/24
to 宴ユーザーグループ
ご回答ありがとうございます。

>Gui系コマンドを経由しないと、「UIが変化した」というフラグが立たないため、セーブデータで正しく扱えないです。
こちら承知いたしました。
そもそものサブシナリオの仕組みや概念について、理解ができました。
認識の上で実装を進めてまいります。

>AdvGuiManagerを使わずに、独自にUI変更のセーブ処理をプログラム制御したほうがいいと思います。
こちらについても、実装方針を上記にシフトして、進めてみようと思います。

もろもろ、ご無理なご相談についても、ご回答いただきまして、ありがとうございました。

2024年3月12日火曜日 21:54:47 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages