キーボード入力など、独自の入力処理をプログラムする
投稿日:2017年7月6日 | 最終更新日:2024年5月27日
宴の入力処理は、典型的なノベルゲームの標準的な動作をするように実装されています。
以下に、これらを自分のゲームの仕様に合わせて、カスタムしたいときの方法をまとめました。
目次
宴の入力処理の基本
宴の入力処理は、Unity標準の「uGUI」を使って実装されています。
UIのレイアウトなど見た目の部分を変えるだけならノーコーディングで変更可能ですが、細かい部分はプログラムでの制御が必要になります。
以下に、大まかなUI制御系のクラスの説明をまとめます。
ページ送りなどのメインの入力処理
宴の文字送りなどの判定は、AdvEngine>UI>InputManagerに処理を発生させるオブジェクトがあります。
基本となる処理は、AdvUguiManager.csで行っています。
AdvUguiManagerをRemoveComponentして、代わりに以下の要領で独自に作成したUI管理クラスをAddComponentすることで、UIの処理を独自に書き換えることができます。
AdvUguiManagerを継承して独自クラスを作る
AdvUguiManager.csは3.1.2からクラスを継承して拡張しやすいように「virtual化、protected化」をしました。
キーボード入力に対応する場合などは、AdvUguiManager.csを継承して必要な個所をoverrideするなりして、処理をカスタムして書き換えてみてください。
継承についての詳細
AdvUiManagerを継承して独自クラスを作る
AdvUguiManager自体もAdvUiManagerを継承していて、AdvEngine本体から参照しているものはAdvUiManagerになります。
なので、根本的に処理を書き替えたいときはAdvUiManagerを継承した独自クラスを作成してそれを使ってください。
バックログと選択肢
バックログはAdvUguiBacklogManager.cs、選択肢表示はAdvUguiSelectionManager.csで制御しています。
これらのコードはAdvEngine本体からなど他から参照されることなく、宴が呼ぶイベントにコールバックを自ら登録し、必要なタイミングでのみ宴の仕組みを呼び出す形で作っています。
処理を書き替えたいときは、上記のクラスは継承せずにコピーなどした独自クラスを作っていってください。
その他の入力処理
その他ノベルゲーム特有のUI部分。つまり、スキップやセーブロードなどのメニューボタンや、セーブロード画面、コンフィグ、タイトル画面の挙動は
「テンプレートしてのUI処理」として定義した「TemplateUI」フォルダ以下にすべてあります。
これらも、AdvEngine本体から参照されることはありませんので、これをもとにコピペするなりして独自のクラスを実装していってください。
ただ、TemplateUI以下のコード相互に参照しているものが多いので、
「少しだけ書き替えるだけですむように、クラスを継承して使いたいので、元のクラスをvirtual化やprotected化して欲しい」という要望がある場合は、ご連絡ください。
クリック検知をカスタム
「クリック処理」の部分だけちょっとuGUIの基本と異なる特殊な処理をしています。
文字送りなどのメインとなるクリック検知は、AdvEngine>UI>InputManagerで行っています。
これは「他のUIの当たり判定がない部分をクリックしたとき」に発生します。
「他のUIの当たり判定がない」というのを検知するために、「一番奥を描画するカメラ」に、
「UguiBackgroundRaycaster」というコンポーネントが必要です。
通常は「UguiBackgroundRaycaster」はClearCameraにAddComponentされています。
ClearCameraは、「画面全体を黒で塗りつぶす」ためのものですが、場合によって邪魔なため消してしまうことあるかと思います。
その場合は、「UguiBackgroundRaycaster」を「一番奥を描画するカメラ」にAddComponentしてください。
クリック判定の仕方を変える
AdvEngine>UI>InputManagerのEventTriggerで呼び出しているメソッドを呼べばノベルのクリック処理が行われます。
なので、上記の「他のUIの辺り判定がない」などのややこしい処理を使いたくない場合は、
自分が呼びたい判定の仕方、タイミングで、「AdvUguiManager」の「OnPointerDown」を呼びます。
プログラムから入力処理を呼び出す
プログラムから呼び出す場合は、下記のようにUguiManager のOnInput()を使います。
サンプルコード
using UnityEngine;
using Utage;
public class SampleInputReturnKey : MonoBehaviour
{
AdvUguiManager UguiManager { get { return uguiManager ?? (uguiManager = FindObjectOfType<AdvUguiManager>()); } }
public AdvUguiManager uguiManager;
void Update()
{
//リターンキーが押されたら宴の入力処理を呼ぶ
if (Input.GetKeyDown(KeyCode.Return))
{
UguiManager.OnInput();
}
}
}
判定の仕方は変えないがクリックが利かないとき
AdvEngine>UI>InputManagerのクリック検知は、「他のUIの当たり判定がない部分をクリックしたとき」に発生します。
「他のUIの当たり判定がない」というのを検知するために、「一番奥を描画するカメラ」に、
「UguiBackgroundRaycaster」というコンポーネントが必要です。
通常は「UguiBackgroundRaycaster」はClearCameraにAddComponentされています。
ClearCameraは、「画面全体を黒で塗りつぶす」ためのものですが、場合によって邪魔なため消してしまうことあるかと思います。
その場合は、「UguiBackgroundRaycaster」を「一番奥を描画するカメラ」にAddComponentしてください。
UI制御を簡単にカスタムするためのコツ
宴のUIのプログラムは基本的に以下の二通りのやり方で実装しています。
その1:AdvEngine本体の状態を毎フレームチェックして、それに合わせてUIを制御する
その2:AdvEngineがもつイベント(選択肢の表示開始など)にコールバックを登録して、呼び出されるイベントに合わせたUIを制御する
その1は簡単に実装できるのですが、関連するプログラムが増えるほど相互の関係や呼び出す順番などを制御するのが困難になりがちで、プログラム拡張には向いていません。
その2は独立性が高いため拡張に向いています。
その2を採用しているのは、AdvUguiSelectionManager.csなどが典型です。
なるべくなら、このその2のやり方(イベントドリブン)で拡張性を上げていきたいと思っています。
カスタムするにあたって、宴のソースコードを直接書き換えてしまうと、宴のアップデートで衝突が起きてしまう可能性が高いのでお勧めしません。
ただ、直接書き換えないとどうしようもないケースもまだ多いと思いますので
・〇〇のタイミングの呼ばれるイベントが欲しい
・クラスを継承して使いたいので、元のクラスをvirtual化やprotected化して欲しい
などの要望がありましたら、Q&Aのほうにご連絡ください。