FungusのConversationコマンドを改造してみる【Unity】

はいどーもキノコ菌の無職と申します。
本日はFungusのConversationコマンドを改造してみようと思います。
ちなみにFungusというのはUnityの会話表示系アセットです。

なんで改造したいのか

Fungusは便利なコマンドがたくさんついています。
単純な会話を実行するときはConversationコマンドを使うと便利です。
共同でゲームを制作しているとき、例えばストーリー担当の方がConversationコマンドを使って一定の文字を書き、プログラム担当の方がそれをそのままブロックの中に突っ込む、ということができるかと思います(特にストーリー担当の方にFungusを一切いじってほしくない場合)。
で、このConversationコマンドなのですが、先程も述べたように「単純な会話」くらいにしか使えません。
例えばBGMの再生は別にコマンドを使用しなければならないのですね。
これがちょっと不便だなーと思いました。

独自に制作しているAudio関連の機能と連携したい

上記の問題だけなら、まあ最悪普通に別のコマンドを使えばよい話です。
が、僕が現在制作中のゲームは独自に制作したAudio関係の機能を使っています。
そのため、Fungus側で用意されているBGMの再生機能等を使うと問題が生じます(例えばオプションで音量をゼロにしているのに、Fungus側の設定と連携できていないので音が鳴ってしまう、など)。
じゃあもういっそConversationコマンドにAudio系の機能を突っ込もうと、そういう考えになったわけなのですね。
別海としては前回の記事と同様に「コマンド」を追加するのでもよいと思います。

構造体にプロパティを追加する

では実際に改造してみます。
Conversation系の機能をコントロールしているクラスは「ConversationManager.cs」です。
このクラスの中にConversationItem構造体があります。
これがConversation中の1行に相当するコマンドとなります。
この構造体に例えば以下のようなプロパティを追加してみましょう。

今回はこのBgmNameがnullか空文字でない場合、音声を再生することにします。
コマンドは「playBgm:ファイル名」とでもしましょう。

ConversationItem生成時の処理を変更する

次にCreateConversationItem実行時の処理を変更します。
中を読んでいくと以下のようなコードが見つかるかと思います。

ここで「:」で区切られる前の部分を判定しています。
というわけでここで「playBgm」の判定を追加します。
こんな感じ。

コメントで「ここから追加分」としたもの以外は一切いじっていません。
これで「playBgm:ファイル名」とコマンドを書いたとき、「ファイル名」の部分が「item.BgmName」に入ります。
item.Textをnullにしているのは、そのままだと会話が表示されてしまうからです(つまり会話でファイル名が表示されてしまう)。

会話実行時の処理を変更する

お次はDoConversationメソッドを変更していきます。
ここで各コマンドはパースされ、実行されます。
今回は

のループの中に処理を追加していきたいと思います。
具体的にはこんな感じ。

AudioManagerあたりのコードは単なる疑似コードなので、実際の自分のコードに合わせて変更してください。
これでConversationコマンド中に「playBgm:town」などとすると、townのBGMが流れるようになりました。

他の機能も全く同じようにして追加することができます。
僕は

・BGMの再生
・BGMの停止
・Voiceの再生
・Voiceの停止
・SEの再生

を追加しました。
他にもなんでも追加しようと思えばできると思います。
ただなんでもかんでもテキストベースで管理するとFungusのよさがなくなるかもなーと思うので若干悩ましいところですね。

直接上書きするかオーバーライドするか

ここまで直接ConversationManager.csを書き換えていきましたが、各メソッドはvirtual宣言されているため、実際には直接上書きするよりもオーバーライドして別コマンドを作成する方がお行儀がよいと思われます。
例えば直接上書きした場合、Fungusがアップデートしたとき、完全に互換性がなくなっちゃうかもしれません。
元の機能が追加されていないデフォルトのバージョンを使いたいときも困りますね(特に問題を切り分けたいときに困ります。独自に追加したせいで発生したバグなのか、それとも元から存在するバグなのか)。
特に僕がいじった部分は「TODO this needs a refactor」なんてコメントがついていましたから、将来変更される可能性が大です。

終わりに

Fungusのコードはとても拡張がしやすいのだなあと思いました。
ツクールMV的な感じでサクサク読めていいですね。
もう少し勉強してみたくなりましたw

ほなそんな感じでまた。

フォローする