Fungusのメッセージダイアログを任意のボタンで送る方法
大変便利なFungusのSayDialogですが、ちょっとキー設定で困ってしまいました。
FungusのSayDialogは、デフォルト設定の場合、キーボードだとSpaceやEnterでしか送ることができません。要するに割と良くアクションキーとしてアサインされるZキーなどでは次へ進ませることができませんが、特にその辺りを変更できそうな箇所も見当たりません。
そもそもどこでボタンが定義されているのか
全然情報が見つからなくて、コードから追っかけました。結局こんなところにありました。
これはSayDialogを作成した時にデフォルトで設定されるインスペクタです。この中にあるDialogInputが入力処理を司っています。
DialogInput.csのUpdateメソッドの中に、該当コードがあります。めでたしめでたし。
if (writer != null && writer.IsWriting) { if (Input.GetButtonDown(currentStandaloneInputModule.submitButton) || (cancelEnabled && Input.GetButton(currentStandaloneInputModule.cancelButton))) { SetNextLineFlag(); } }
※上に書いた通り、全然情報なかったんですが、常識なんでしょうか……?
StandaloneInputModule
上記コードは何かというと、currentStandaloneInputModule.submitButton
が押されたときか、currentStandaloneInputModule.cancelButton
が押されたときに、次に進むというコードが書かれています。
このcurrentStandaloneInputModule
なるメンバ変数は、UnityEngine.EventSystems.StandaloneInputModule
のインスタンスです。要はUnityの機能です。submitやらcancelやらはどこで設定されているのかというと、ここです。
InputManagerですね。ノットユーザーフレンドリーで有名な。
ゲーム中にキーコンフィグを作りたい場合はどうすれば?
起動時にわけのわからないタブで設定を強いるというのは、そもそもUIとして大問題で、ゲームの品質を下げてしまいます。なので、普通はキーコンフィグ画面をゲーム内に設けると思います。
ただ、デフォルトのSayDialogがStandaloneInputModuleのSubmitとCancelを参照している以上、ゲーム内でキーコンフィグを作った場合、FungusのSayDialogに関しては、次のどちらかの対応を取る必要があります。
- ゲーム内でInputManagerを再生成する
- DialogInputを継承したクラスがUpdate処理をオーバーライドする
1は大変辛いです。2は大変楽です。なので、2でいきましょう。DialogInputを継承したMyDialogInputは、具体的にはこんな感じになります。
public class MyDialogInput : Fungus.DialogInput { protected override void Update() { base.Update(); if (EventSystem.current == null) { return; } if (writer != null && writer.IsWriting) { if (Input.GetKeyDown("Z")) { //ここを好きなキーに設定する SetNextLineFlag(); } } } }
base.Update()でDialogInputのUpdate()を呼び出してますが、base.Update()が呼び出されると、SubmitやCancelでも送れてしまうので、不都合がある場合はDialogInput.Updateの処理をべた書き(コピペ)して、DialogInput.Update()を呼び出さずに隠ぺいしてしまうと良いでしょう。
実装が終わったら、MyDialogInputをSayDialogのインスペクタに追加します。
これで、Zキーを押してダイアログを送ることができるようになると思います。
ライセンス
この作品はユニティちゃんライセンス条項の元に提供されています。
なお、FungusはMITライセンスです。