[UNITY]2DRPG開発日誌 #67 FungusをC#スクリプトから制御する方法(ローカライズ含む)

さて、以前の記事で書いたように、Fungusはスクリプトからブロックやコマンドを追加することができません。

ただし、ブロックとコマンドさえ手作業で作っておけば、あとは大部分をスクリプトから制御することが可能です。

はじめに、ブロックとFungus変数を用意します。

(画像はexecuteをexcuteとタイプミスしているのでご注意ください…)

用意する変数は

  • String quote(喋る内容)
  • Int executeNum(ブロックを実行した回数)
  • Int loopNum(ブロックを実行する回数)
  • String nextBlock(次のブロックのSendメッセージキー。存在しないキーを入力しておく)

です。

で、「SayBlock_CharacterName」というブロックも作っておきます。"CharacterName"の部分は喋らせるキャラクターの名前にしておきましょう。

続いて、そのブロックのなかにコマンドを作ります。

まず実行トリガーはMessage Receivedにしておき、解りやすいようにキーはブロック名と同じにしておきます。

コマンドは、次のように作ります。

  1. WhileexecuteNum loopNum に到達するまでループさせる。
  2. Set VariableexecuteNum を+1する。
  3. Say で喋らせたいキャラクターのセリフを作る。セリフは {$quote} とだけ入力しておく。
  4. EndWhileを閉じる
  5. Send Message で、メッセージ内容を nextBlock に指定する。

以上でブロック一つ完成です。これをキャラクターの数だけ作っておきます。

※ 5.についてですが、存在しない SendMessage をすると何も起きずにブロックが終了します。
つまり、会話を続けたいときは次のキャラクターのブロックを SendMessage で指定して、会話を終了させたいときは存在しない SendMessage を指定すれば良いわけです。
ここを書き換え忘れると会話の順番や終了タイミングがおかしくなるので注意しましょう。

次に、コードはこんな風に書きます。

    void 実行()
    {
        //セリフ内容とループ回数をセット
        flowchart.SetStringVariable("quote", "最初のセリフ");
        flowchart.SetIntegerVariable("loopNum", 2);

        //MessageRecieveで実行
        Fungus.Flowchart.BroadcastFungusMessage("SayBlock_CharacterName");
    }

    void Update()
    {
        //2番目のセリフをセット。
        if(flowchart.GetIntegerVariable("executeNum") == 1)
            flowchart.SetStringVariable("quote", "2番目のセリフ");
    }

こうすれば、Fungusを使って「指定したセリフの数だけ喋らせて、終わったら次のキャラクターにパスする」という流れを完全にC#スクリプトから制御することができます。

実際に実装しようとするとこの100倍複雑なコードを書く必要がありますが、基本はこの流れで問題なさそうです…!