バックログ呼び出し時のキャラクター消去について

82 views
Skip to first unread message

MM

unread,
Jan 28, 2025, 11:40:56 PM1/28/25
to 宴ユーザーグループ

宴のバージョン4.1.5
unityのバージョン 6(6000.0.34f1)

お世話になっております。
頻繁な質問でお手を煩わせて申し訳ないのですが、再びご助言いただけましたら幸いです。

バックログの機能について、バックログが呼び出されるとメッセージウインドウが一時的に消えて、キャラクターだけがバックログ後ろに表示されるのがデフォルトと存じます。

現在、立ち絵(レイヤーはUIより下層のレイヤーを設定)、メッセージウインドウ(レイヤーはUI)、メッセージウインドウの前にプレイヤーキャラクター(UIレイヤーより上層のレイヤーを設定)という順で表示させています。

バックログを起動すると立ち絵とプレイヤーキャラクターのみ表示される状態ですが、こちらプレイヤーキャラクターもバックログ呼び出し中は一時的に消えるようしたいです。

過去の質問を検索して
こちらで回答されていらしたことを試してみたのですが、やはり消えるのはメッセージウインドウだけで、プレイヤーキャラクターが残る状態でした。

プレイヤーキャラクターのレイヤーをUI、orderは1と2に設定してみましたが、やはり残りました。
(表情変化があるため、人物のベースとその上に乗る表情で画像とレイヤーをわけています)

こちら、どのようにすればプレイヤーキャラクターをバックログ呼び出し中は消えるようになりますでしょうか?
また、メッセージボックスが属するUIレイヤーより下層のレイヤーに設定した立ち絵もバックログ中に消すことはできますでしょうか?

ご助言いただけましたら幸いです。
よろしくお願い申し上げます。

マッドネスラボ

unread,
Jan 29, 2025, 4:40:58 AM1/29/25
to 宴ユーザーグループ
レイヤーの順番は表示の順番であって、オブジェクトの親子関係ではないので、表示のオンオフが連動するわけではないです。
(一応、オブジェクトの親子関係を持たせる方法もあるのですが、親子関係に連動してオンオフがされてしまうとアニメーションやフェードが途中で止まって再開されないという問題があるのでこの場合は使わないほうがいいです)

UIの状態に合わせて、対象のレイヤーの表示、非表示を切り替えるという拡張スクリプトを書くという手法があります。

UIの状態変更に合わせた拡張をしやすくするイベントを追加して、そのサンプルコードも追加したので、添付のパッケージファイルを適用してください。
(添付ファイルのダウンロード後に、拡張子が *. gzになっている場合は、*.unitypackageに変えてからプロジェクトに適用してください)
この変更は、次回の宴のアップデートにも反映させる予定です。


添付のパッケージファイルを適用すると、Utage/Sample/Scripts/SampleCustomUiState.cs というコンポーネントが追加されるので
それをAdvEngine>UIオブジェクトなど、任意の場所にAddComponentしてください。

このコンポーネントを適用すると、
バックログ表示状態のときと、メッセージウィンドウが非表示状態のとき(デフォルトではメニューの×を押したときや右クリックを押したとき)に、
SampleCustomUiStateはLayerNamesに設定されたレイヤーを非表示にします。
ss_0270.png


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:
FixUiChangeState.unitypackage

MM

unread,
Feb 1, 2025, 7:51:14 AM2/1/25
to 宴ユーザーグループ
早速のご対応、ありがとうございました!
パッケージをインポートして、AdvEngine>UIにadd compornent、教えていただいたとおりにUnityで設定したレイヤーを指定したのですが、バックログおよび右クリックでメッセージボックスを消す状態でも表示されるままでした。
レイヤー名のスペルミスがないように、コピー&ペーストして設定も試しましたが、やはり表示されたままでした。

以下、AdvEngine>UIに設定したものです。
Character2というUnity上で6番に設定したレイヤーを消去対象にしています。

11.jpg

よく確認して設定したつもりでしたが、何か間違っているところがありますでしょうか・・・?
再度ご教授いただけましたら助かります。
よろしくお願いいたします。



2025年1月29日水曜日 18:40:58 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Feb 1, 2025, 8:28:59 AM2/1/25
to 宴ユーザーグループ
すみません。設定しる名前は、宴のレイヤーシートで設定した「LayerName」を設定してください。

名前の付け方が悪くてUnityのLayerと混ざってしまって混乱させてしまって申し訳ありません。



2025年2月1日土曜日 21:51:14 UTC+9 MM:

MM

unread,
Feb 1, 2025, 8:36:23 AM2/1/25
to 宴ユーザーグループ
お返事ありがとうございます。

実は宴のほうのレイヤーかと思ってそちらも試してみたのですが、同じく消えませんでした。
消したいレイヤーは、先ほどのCharacter2に属するもので、宴で設定した二つのレイヤーです。
この二つのレイヤーをLayerNamesのリストにコピー&ペーストして設定しましたが、残るままでした。

2025年2月1日土曜日 22:28:59 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Feb 1, 2025, 7:36:22 PM2/1/25
to 宴ユーザーグループ
SampleCustomUiStateは、Awake時にイベント登録を行っているので、一度のそのオブジェクトがアクティブにならないとイベント登録がおわらず動作しません。
ただ、見る限りはUIオブジェクトにAddComponentされているので、通常であればAdvEngine起動時にアクティブになるので問題ないはずです。

//                Debug.LogError("レイヤーが見つかりません");
の部分のコメントアウトを解除したり、ほかの場所にDebug.Logをするなどして原因を調べてみてください。

上記の「レイヤーが見つかりません」というエラーが出るようなら、
・名前の最後にスペースなどの視認できない文字が入っていないか
・そのレイヤー名のオブジェクトがGraphicManager以下に作成されているか
などを調べてください。


エラーが出ないようでしたら、
そもそも処理が発生してない可能性がありますので、
OnChangeUiStatusが呼ばれているかなどをDebugLogや、IDE(VisualStudioなどのプログラムエディター)のブレークポイントなどを使って調べてみてください。


2025年2月1日土曜日 22:36:23 UTC+9 MM:
Reply all
Reply to author
Forward
0 new messages