UI系コンポーネント


投稿日:2025年1月30日 | 最終更新日:2025年2月1日

全体構成

宴のUIコンポーネンの全体構成は以下のようになっています。

中核の部分

Utage\Scripts\ADV\UI フォルダ以下
メッセージウィンドウや、バックログ、選択肢など
ノベルゲーム、会話シーン両方で中核となる処理。

ノベルゲームに特有のUI

Utage\Scripts\TemplateUI フォルダ以下

タイトル画面やギャラリーなど、ノベルゲームに特有のUI処理。会話シーンで使う場合には未使用な部分です。

UIの拡張方法

UI処理を変えたいとき、プログラムを直接書き換えるのは、宴をアップデートしたときに元に戻ってしまったりするので、あまりお勧めしません。
ちょっとした処理を追加する場合は、各コンポーネントに設定されている、拡張用のイベントを使ってください。
殆どのUIプログラムはOnInitに追加イベントを設定することで、UI表示開始時の処理を追加設定できます。

拡張用イベント

コンポーネント イベント名 呼ばれるタイミング
AdvUguiManager OnChangeStatus UIの表示モード(バックログか通常か)が変更されたとき
AdvUguiBacklog OnInit バックログの各アイテムの表示開始時
AdvUguiSelection OnInit 選択肢の各ボタンの表示開始時
UtageUguiCgGalleryItem OnInit CGギャラリーの各ボタンの表示開始時
UtageUguiSceneGalleryItem OnInit シーンギャラリーの各ボタンの表示開始時
UtageUguiSoundRoomItem OnInit サウンドルームの各ボタンの表示開始時
UtageUguiConfig OnLoadValues コンフィグ画面全体で値がロードされた時(表示開始時やデフォルト設定に戻したとき)
UtageUguiSaveLoadItem OnRefresh セーブロードの各ボタンの値が更新された時(表示開始時や、セーブされたときなど)

サンプル

宴の拡張のサンプルコードは、 Assets/Utage/Sample/Scripts/フォルダ以下にあります。
UIの拡張サンプルもいくつかここにあります。

たとえば、SampleBacklogCharacterIconは、バックログにキャラクターアイコンを追加表示するサンプルです。
Backlog.OnInit.AddListener(OnInit); によって表示開始時のイベントを設定し、SampleBacklogCharacterIconはのOnInitが追加で呼ばれるようにしています。

イベントの登録を簡易的に行うためAwakeメソッドをを使っていますが、タイミングに懸念があるようならインスペクター上でOnInitイベントを設定するのが確実です。

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UtageExtensions;

namespace Utage
{
    public class SampleBacklogCharacterIcon : MonoBehaviour
    {
        //キャラクターアイコン
        public Image characterIcon;

        //アイコン情報
        [System.Serializable]
        public class IconInfo
        {
            public string characterLabel;
            public Sprite sprite;
        }
        public List<IconInfo> iconInfos = new();

        private AdvUguiBacklogTMP Backlog => this.GetComponentCache(ref backlog);
        AdvUguiBacklogTMP backlog;
        void Awake()
        {
            Backlog.OnInit.AddListener(OnInit);
        }

        public void OnInit()
        {
            IconInfo iconInfo = null;
            //バックログの中のキャラクターラベルを取得
            var characterLabel = Backlog.Data.GetCharacterLabel();

            //キャラクターラベルに対応するアイコン情報を取得
            if (!string.IsNullOrEmpty(characterLabel))
            {
                foreach (var info in iconInfos)
                {
                    if(info.characterLabel == characterLabel)
                    {
                        iconInfo = info;
                        break;
                    }
                }
            }

            if (iconInfo == null)
            {
                //アイコン情報が見つからない場合は非表示
                characterIcon.gameObject.SetActive(false);
            }
            else
            {
                //キャラクターラベルに対応するアイコンを表示
                characterIcon.gameObject.SetActive(true);
                characterIcon.sprite = iconInfo.sprite;
            }
        }
    }
}

コンポーネントを継承する

拡張イベントはあくまで「追加」の処理なので、UIのフローを変えたりしたい場合にはそれだけでは難しいことがあります。
宴のデフォルトのUIコンポーネントの処理自体を書き変えたい場合は、C#の継承という仕組みを使う必要があります。
以下を参考にしてください。
UI部分のプログラムを継承して独自にカスタムする
キーボード入力など、独自の入力処理をプログラムする

既存のコンポーネントを使わずに独自に書く

UIはノベルの再生部分とは独立して作られているので、UIだけ全部独自に書いても動作します。
会話シーンに使う場合などで、完全に独自のUI処理が必要な場合は、UI部分は独自にコードを書いてください。
ただし、UIコンポーネント同士は処理が依存してることが多いので、一部だけ独自にする場合は依存関係に注意してください。