Unity Fungusで看板に接触した時に出すメッセージを実装してみる
会話ウィンドウなどのメッセージ回りに何か良いものないかな、と漁っていた時、この記事読んでFungusが面白そうだったので、色々弄ってみました。
【Unity】ゲームのちょっとした会話場面にFungusを使ってみる - まともな開発者になりたい
とりあえず今回は看板とかヘルプオブジェクトとか、何かに接触した時に表示されるウィンドウのFungusでの実装について紹介します。
準備
AssetストアからFungusをImportして、SayDialogとFlowchartを作成します。 詳しくは上記リンクにて。
物体接触時にトリガーを発火させる
まず、Flowchartに対して、SpriteやRigidbodyなどの物体設定を行います。右側のキノコがFlowchartオブジェクトです。このキノコにこはく(Unityちゃん)が接触すると、Unityちゃんがしゃべるようにしたいと思います。
ということで、下の図は、SpriteやRigidbodyなどを設定したFlowchartのインスペクタプロパティです。
見ての通りKinematicで普通に物体設定しているだけです。
次に、Flowchartのデフォルトブロックを選択し、以下を設定します。
- Execute On EventにMonoBehaviour->Collision2Dを設定
- Tag Sizeを1にして、Element 0にUnityちゃんのTagを設定
- Fire OnをNothing以外に設定
- CommandsにNarrative->Sayを追加し、セリフを設定
2を設定しないと、何にでも(つまり床にも)接触判定してしまいます。
これでOK。Play!
Unityちゃんがキノコに接触すると、セリフを表示します。
IsTrigger時の注意
看板とかヘルプオブジェクトの場合、コライダーは透過的(要するにIsTrigger)であることが多いと思います。ところがIsTriggerにすると、メッセージが表示されなくなります。
Execute On Eventをよく見ると、Collision2DとTrigger2Dがちゃんとわかれています。なので、IsTriggerを設定する場合はTrigger2Dを設定しましょう。
※実はかなり長い間気づきませんでした……
メッセージ表示中に一時停止したい場合の注意
Time.timeScale=0にすると、FungusのFlowchart諸共止まります。要するにTime.timeScale=0は使えません。 UpdateやFixedUpdateなどの処理をブロックするなど、頑張って手で止める必要があります。
1シーンにたくさんの看板オブジェクトを配置する場合は
1看板に1Flowchartを配置することになります。Flowchartなので、処理ブロックが順々に遷移するというのが基本ですが、看板オブジェクトの場合、接触した時に内容を表示してフローが終わります。 ある看板と別の看板のフローは別、と考えた方が自然ですので、Flowchartを看板の数だけ用意するのが良いと思います。
もし、1Flowchartでやるなら、Collisionを利用せず、MessageReceivedを使用するのが一番素直です。これについては次回紹介します。
次回
この作品はユニティちゃんライセンス条項の元に提供されています