キノコの自省録

日々適当クリエイト

Unity Fungusで看板に接触した時に出すメッセージを実装してみる

会話ウィンドウなどのメッセージ回りに何か良いものないかな、と漁っていた時、この記事読んでFungusが面白そうだったので、色々弄ってみました。

【Unity】ゲームのちょっとした会話場面にFungusを使ってみる - まともな開発者になりたい

とりあえず今回は看板とかヘルプオブジェクトとか、何かに接触した時に表示されるウィンドウのFungusでの実装について紹介します。

準備

AssetストアからFungusをImportして、SayDialogとFlowchartを作成します。 詳しくは上記リンクにて。

物体接触時にトリガーを発火させる

まず、Flowchartに対して、SpriteやRigidbodyなどの物体設定を行います。右側のキノコがFlowchartオブジェクトです。このキノコにこはく(Unityちゃん)が接触すると、Unityちゃんがしゃべるようにしたいと思います。

f:id:kinokorori:20190602130919p:plain

ということで、下の図は、SpriteやRigidbodyなどを設定したFlowchartのインスペクタプロパティです。

f:id:kinokorori:20190508001416p:plain

見ての通りKinematicで普通に物体設定しているだけです。

次に、Flowchartのデフォルトブロックを選択し、以下を設定します。

  1. Execute On EventにMonoBehaviour->Collision2Dを設定
  2. Tag Sizeを1にして、Element 0にUnityちゃんのTagを設定
  3. Fire OnをNothing以外に設定
  4. CommandsにNarrative->Sayを追加し、セリフを設定

f:id:kinokorori:20190508001647p:plain

2を設定しないと、何にでも(つまり床にも)接触判定してしまいます。

これでOK。Play!

f:id:kinokorori:20190508002130p:plain
美味しそうとは思いませんが……

Unityちゃんがキノコに接触すると、セリフを表示します。

IsTrigger時の注意

看板とかヘルプオブジェクトの場合、コライダーは透過的(要するにIsTrigger)であることが多いと思います。ところがIsTriggerにすると、メッセージが表示されなくなります。

Execute On Eventをよく見ると、Collision2DとTrigger2Dがちゃんとわかれています。なので、IsTriggerを設定する場合はTrigger2Dを設定しましょう。

※実はかなり長い間気づきませんでした……

f:id:kinokorori:20190508003149p:plain
確かに不味そう

メッセージ表示中に一時停止したい場合の注意

Time.timeScale=0にすると、FungusのFlowchart諸共止まります。要するにTime.timeScale=0は使えません。 UpdateやFixedUpdateなどの処理をブロックするなど、頑張って手で止める必要があります。

1シーンにたくさんの看板オブジェクトを配置する場合は

1看板に1Flowchartを配置することになります。Flowchartなので、処理ブロックが順々に遷移するというのが基本ですが、看板オブジェクトの場合、接触した時に内容を表示してフローが終わります。 ある看板と別の看板のフローは別、と考えた方が自然ですので、Flowchartを看板の数だけ用意するのが良いと思います。

もし、1Flowchartでやるなら、Collisionを利用せず、MessageReceivedを使用するのが一番素直です。これについては次回紹介します。

次回

kinokorori.hatenablog.com

f:id:kinokorori:20190508004005p:plain

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