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コンポーネント同士は処理が依存してることが多いので、一部だけ独自にする場合は依存関係に注意してください。