FungusでImageのSpriteを変更するコマンドを追加する方法【Unity】

はいどーもこんばんは、病に冒されたキノコです。
本日はFungusについてちょっと書こうと思いますよ。

Fungusってなに

ゲーム画面で会話が作れるUnityのアセットです。
詳しくは以下のサイトを参照してください。
http://fungusgames.com/

ImageのSpriteを変更したい

FungusのFlowchartの各BlockにはツクールMVみたいな感じでコマンドを追加することができます。
ここで僕はImageのSpriteを変更したかったのですが、どうもコマンドが存在しなかったんですね。
で、公式フォーラムを見たらちょうど「How to switch background during scene?」という質問あがりました。
その回答をまとめると「2D SpriteならFade Spriteからいけるけど、uGUIでやりたいなら一つ一つのUIをあらかじめ作っておいて、Set Activeを呼ぶといいよ」というものでした。
2D Spriteの方はともかく、uGUIはぶっちゃけめんどくせぇ!
というわけで、自分でコマンドを作ることにしました。

コマンドの作り方

コマンドの作り方はFungusに入っているFadeSprite.csを参考にしました。
これを見るに、どうもCommandパターンで作られているようです(余談ですが、僕が仕事で作った会話系のアセットもCommandパターンでやってました)。
コードを見た感じは以下の通りです。

・Executeメソッドが呼ばれたタイミング、つまりコマンドに到達したとき最初にOnEnterを実行(物理エンジンのOnEnter系とは全然関係ないので注意)
・コマンドの終了時の後処理としてOnExitを呼ぶ
・OnExitは通常Continueメソッドから呼ばれる
・OnEnterからreturnするタイミングでContinueメソッドを呼ぶのがお作法?

で、実際に自分でImageのSpriteを変更するコマンドを組んでみました。
それが以下のコードです。

使い方

上記のコードをAssetsのどこでもいいのでぶち込んでください。
そうするとFlowchartの各ブロックに登録できるコマンドにChange UI Spriteというコマンドが追加されます。
具体的には「UI→Change UI Sprite」ですね。
spriteを変化させたいImageをTargetImageに設定し、変化後のSpriteをNextSpriteに設定すればOKです。

問題点

もしもFungusのFlowchartを1つのシーンでしか使わないなら、上記のコードでも問題はないと思います。
ですがもしFungusのFlowchartをプレハブ化しておいて、いろんなシーンで一つのFlowchartを使い回す場合、上記のコードのコマンドとして設定したTargetImageがMissing状態になるかと思われます。
対処法でパッと思いついたのは以下の3通りです。

1.Missingになったものを手動で全て設定しなおす
2.TargetImageをシングルトンにする
3.Zenjectを使って依存性の注入をおこなう

1は数によってはどちゃくそめんどくさいですが、設定する数が少ないならこれでも……といった感じでしょうか。
2もアリと言えばアリな気がします。
僕は3で対応することにしました。ただこれはZenjectに依存した作りになるので、その点をよく注意しておく必要があるかなと思います。

終わりに

Fungusのことをチマチマ調べているのですが、やっぱり他の人が書いたC#コードを読むのは楽しいですね。
「そういう作り方があるのか!」なんてものを見つけたときは嬉しさもひとしお。
C#うまく使えるようになりたいですねえ。

ほなそんな感じでまた。

フォローする