キノコの自省録

日々適当クリエイト

Fungusのメッセージダイアログを任意のボタンで送る方法

大変便利なFungusのSayDialogですが、ちょっとキー設定で困ってしまいました。

f:id:kinokorori:20190511021103p:plain
FungusのSayDialog

FungusのSayDialogは、デフォルト設定の場合、キーボードだとSpaceやEnterでしか送ることができません。要するに割と良くアクションキーとしてアサインされるZキーなどでは次へ進ませることができませんが、特にその辺りを変更できそうな箇所も見当たりません。

そもそもどこでボタンが定義されているのか

全然情報が見つからなくて、コードから追っかけました。結局こんなところにありました。

f:id:kinokorori:20200106221916p:plain:w300
SayDialogのインスペクタ

これは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やらはどこで設定されているのかというと、ここです。

f:id:kinokorori:20200106223029p:plain
キーアサイン変更

InputManagerですね。ノットユーザーフレンドリーで有名な。

ゲーム中にキーコンフィグを作りたい場合はどうすれば?

起動時にわけのわからないタブで設定を強いるというのは、そもそもUIとして大問題で、ゲームの品質を下げてしまいます。なので、普通はキーコンフィグ画面をゲーム内に設けると思います。

ただ、デフォルトのSayDialogがStandaloneInputModuleのSubmitとCancelを参照している以上、ゲーム内でキーコンフィグを作った場合、FungusのSayDialogに関しては、次のどちらかの対応を取る必要があります。

  1. ゲーム内でInputManagerを再生成する
  2. 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のインスペクタに追加します。

f:id:kinokorori:20200106225427p:plain
MyDialogInputを追加

これで、Zキーを押してダイアログを送ることができるようになると思います。

ライセンス

f:id:kinokorori:20190508004005p:plain

この作品はユニティちゃんライセンス条項の元に提供されています。

なお、FungusはMITライセンスです。