レイヤーの順番は表示の順番であって、オブジェクトの親子関係ではないので、表示のオンオフが連動するわけではないです。
(一応、オブジェクトの親子関係を持たせる方法もあるのですが、親子関係に連動してオンオフがされてしまうとアニメーションやフェードが途中で止まって再開されないという問題があるのでこの場合は使わないほうがいいです)
UIの状態に合わせて、対象のレイヤーの表示、非表示を切り替えるという拡張スクリプトを書くという手法があります。
UIの状態変更に合わせた拡張をしやすくするイベントを追加して、そのサンプルコードも追加したので、添付のパッケージファイルを適用してください。
(添付ファイルのダウンロード後に、拡張子が *. gzになっている場合は、*.unitypackageに変えてからプロジェクトに適用してください)
この変更は、次回の宴のアップデートにも反映させる予定です。
添付のパッケージファイルを適用すると、Utage/Sample/Scripts/SampleCustomUiState.cs というコンポーネントが追加されるので
それをAdvEngine>UIオブジェクトなど、任意の場所にAddComponentしてください。
このコンポーネントを適用すると、
バックログ表示状態のときと、メッセージウィンドウが非表示状態のとき(デフォルトではメニューの×を押したときや右クリックを押したとき)に、
SampleCustomUiStateはLayerNamesに設定されたレイヤーを非表示にします。
SampleCustomUiState のソースコードは以下の通りです。
サンプルなので、さらに調整が必要な場合は
これをコピペするなどして(このコード自体は書き変えず)、新たなコンポーネントを作成・追加して独自にアレンジしてみてください。
using System;
using System.Collections.Generic;
using UnityEngine;
using UtageExtensions;
namespace Utage
{
public class SampleCustomUiState : MonoBehaviour
{
AdvEngine Engine => this.GetAdvEngineCacheFindIfMissing(ref engine);
[SerializeField] AdvEngine engine;
//表示のオンオフをしたい宴のレイヤー名のリスト
[SerializeField] List<string> layerNames = new ();
AdvUguiManager UiManager => Engine.UiManager as AdvUguiManager;
void Awake()
{
UiManager.OnChangeStatus.AddListener(OnChangeUiStatus);
}
//UIの状態が変わったときに呼ばれる
void OnChangeUiStatus()
{
switch (UiManager.Status)
{
case AdvUiManager.UiStatus.Backlog:
ChangeLayerVisible(false);
break;
case AdvUiManager.UiStatus.HideMessageWindow:
ChangeLayerVisible(false);
break;
case AdvUiManager.UiStatus.Default:
ChangeLayerVisible(true);
break;
}
}
//レイヤーの表示、非表示を切り替える
void ChangeLayerVisible(bool visible)
{
foreach (var layerName in layerNames)
{
AdvGraphicLayer layer = Engine.GraphicManager.FindLayer(layerName);
if (layer == null)
{
// Debug.LogError("レイヤーが見つかりません");
continue;
}
layer.Canvas.enabled = visible;
}
}
}
}
2025年1月29日水曜日 13:40:56 UTC+9 MM: