>バックログを表示させた際、メッセージボックスとセーブロードなどのメニュー項目がオフされるようになっていますが、こちらのスレッドで教えていただいたToggleで作ったボタンもバックログ表示時にオフする方法はありますでしょうか?
やり方はいくつかあります。
〇その1 AdvUguiManagerのOnChangeStatusを使う
ノベルゲームのメイン画面の表示ステータスは、以下の3つがあります。
Default, //通常
Backlog, //バックログ
HideMessageWindow, //メッセージウィンドウ非表示
AdvUguiManagerのOnChangeStatusで、これが変化したときに呼ばれるイベントを設定可能です。
Utage/Sample/Scripts/SampleCustomUiState.cs がそれを使用するサンプルコードです。
これをコピペして以下のように改変するなどして、独自のコンポーネントを作ってください。
public GameObject toggleButton;
//UIの状態が変わったときに呼ばれる
void OnChangeUiStatus()
{
switch (UiManager.Status)
{
case AdvUiManager.UiStatus.Backlog:
toggleButton.SetActive(false);
break;
case AdvUiManager.UiStatus.HideMessageWindow:
toggleButton.SetActive(false);
break;
case AdvUiManager.UiStatus.Default:
toggleButton.SetActive(true);
break;
}
}
〇その2 UtageUguiMenuButtonsのソースコードを参考に表示制御
バックログ中のメニュー表示のオンオフは、UtageUguiMenuButtons.csのLateUpdateで調整しています。
Engine.UiManager.Status == AdvUiManager.UiStatus.Default という部分は、通常表示の状態のみという判定で、バックログやメッセージウィンドウが非表示の場合はfalseになります。
ただし、Unityの仕様で、GameObjectのactiveがオフだったり、コンポーネントがenableがオフの場合は、LateUpdateは呼ばれないので
自分自身のオブジェクトをオフにしてしまうと、LateUpdateが呼ばれなくなってしまうので注意してください。
UtageUguiMenuButtons.csでいうと、以下の部分で表示用のオブジェクトのみオンオフを切り替えるようにしています。
//メニューボタンの表示・表示を切り替え
if (rootButtons != null)
{
rootButtons.SetActive(activeMenuButtons);
}
>なのでセーブロード画面と同じ階層にバックログを設定してボタンが隠れるようにしてやればいいのか、
描画順だけの問題で、バックログよりも奥に表示されていればよいのであれば、Unityの仕様に従って描画順を調整するだけです。
UnityのUIは、同じCanvasであれば、ヒエラルキーの順番(上から深さ優先で)で表示されるので、
添付画像のように、ToggleをSelectionとBackLogの間に置くなどしてください。
>また、一枚絵が出るイベントなど、任意の箇所でこのToggleボタンをオンオフにする方法がありますでしょうか?
シナリオ側から任意に独自の処理を呼び出いのであれば、SendMessageコマンドなどなんらかの拡張方法を使うというのが基本です。
今回のように単純にオンオフするだけでよいのであれば、
・Bool型のパラメーターを追加
・シナリオ上では任意のタイミングで、Paramコマンドを使ってそのパラメーターをオンオフする
・パラメータのオンオフと、目標のGameObjectのオンオフを一致させるコンポーネントを追加する。(下記参照)
public class SampleOnOffWithParam : MonoBehaviour
{
public AdvEngine Engine => this.GetAdvEngineCacheFindIfMissing(ref engine);
[SerializeField] protected AdvEngine engine;
// パラメータのラベル名
public string paramLabel = "paramLabel";
public GameObject target;
void Update()
{
if (!Engine.IsStarted) return;
if (!Engine.Param.IsInit) return;
target.SetActive(Engine.Param.GetParameterBoolean(paramLabel));
}
}
Paramコマンドを使うのは、簡易的な拡張ではあるのですが、
実装難易度の高いセーブデータ拡張にも自動的に対応できるので、今回のようなケースではこちらのほうが良いかもしれません。
他にも、Adv Scenario Playerの、On Begin Command などで、コマンドの実行開始時や実行終了時に拡張イベントを設定できます。
これを利用して、特定のコマンドの実行時に自動的によばれる処理などを実装可能です。
(ただ、これは制御が難しいのであまりお勧めしないです)
2025年3月11日火曜日 10:52:19 UTC+9 MM: