👉 前の記事 Fungusの導入からカスタムまで(1)
ブロックの呼び出し方
fungusをゲーム内の会話シーンで使う、ということを想定してますので、呼び出し方について解説します。

まずExecute On Event を MessageReceivedに変えます。Startなんて使わないです。
むしろMessageReceivedしか使わないです。これは何か?っていうと、このMessageってとこの文字列を受け取ったら、このブロックを実行するよ、ってことです。
どこから実行するか?っていったら多分操作してるキャラからになると思うので、操作キャラに適当にPlayerCtrl.csでもつけてそこにコードを書いていきます。
using UnityEngine;
using Fungus;
public class PlayerController : MonoBehaviour
{
[SerializeField] private Flowchart flowchart = null;
void Update()
{
if (Input.GetButtonDown("Submit"))
{
flowchart.SendFungusMessage("pro2L1");
}
}
}
雑なんですが、こんな感じ。
ただ上のは本当に雑で、submit押したらメッセージ出るわけですね。そしてその間操作とかは出来るので、updateを一旦止める必要があります。
void Update()
{
if (GManager.instance.gameState == "")
{
if (Input.GetButtonDown("Submit"))
{
GManager.instance.gameState = "talk";
flowchart.SendFungusMessage("pro2L1");
}
}
こんな感じ。いきなりGManager.instance.gameStateってやつが出てきたんだけど、何?ってなると思うんですが、これはまぁインスタンス変数です。unityってシーンが変わったり、実行してるソースが変わったりすると変数初期化されるんですが、初期化されたくない変数とか色んなとこで使いたい変数をインスタンス化しておきましょうってやつだと思ってください。
ゲームマネージャーの作り方についてはこちらを参考に。
https://dkrevel.com/makegame-beginner/make-2d-action-game-manager/
ゲームの作り方さん
で、このままだと会話が終わってもgamestateがtalkなので、動けないわけです。
メソッドを作ります。
void talkEnd()
{
GManager.instance.gameState = "";
}
これをfungus側からcall methodすればOKってわけです。

こんな感じ。
fungusのよく使ってるコマンドについて
call methodみたいな私がよく使ってるやつをいくつかまとめておきます。
まぁでもなんでもfungus側のコマンド使うより、call methodでCSに書いといた方が安全ってのもある。
あと効果音はいいけど、play Musicで音楽流すと、ESCでstopのとこまで飛ばされてなんか音楽消えない時ある。会話終わったらシーンを切り替えるような時じゃなければあんま使わないほうがいいかも。
| コマンド | 説明 |
|---|---|
| Say | メッセージの表示。基本。 |
| Portrait | 立ち絵表示。基本の基本。 |
| Call Method | メソッドを呼ぶ。便利。 |
| Set Active | オブジェクトの表示・非表示の切り替え。 |
| Play Anim State | アニメーションの切り替え。 |
| Wait | 指定秒数待つ。ただしFungus側の待ちなので、ゲーム全体を止めたいなら GameState などで Update 停止を管理する必要あり。 |
| Call | 他のブロックに飛ぶ。goto みたいなもの。 |

Set UI Image を使えば、ウィンドウ画像替えられます。イベント時だけなんか透明っぽくしたとかの時に。
ブロックの呼び出し方・その2
上記のだととりあえずsubmitに反応して、ブロックを呼び出してるので、話しかけたら?っていうのはどうやってるの?って話しです。
まずはColliderで当たり判定を作ります。

こんな感じ。で、NpcCtrlでこのキャラはどのブロックを呼び出すよ、(つまりどのセリフを喋るよってこと)を設定します。
public class NpcCtrl : MonoBehaviour
{
private void OnCollisionStay2D(UnityEngine.Collision2D collision)
{
if (flowchart && collision.gameObject.tag == "Player" && GManager.instance.gameState == "playing")
{
if (chaID == 10)
{
GManager.instance.talkId = "rail1";
}
}
}
void OnCollisionExit2D(Collision2D collision)
{
GManager.instance.talkId = "";
}
}
プレイヤーと接触すると、GManager.instance.talkIdに文字列が入るわけです。離れるか、会話が終わったらGManager.instance.talkIdを初期化しましょう。
そしたらPlayerCtrl側で実行してあげます。
void Update()
{
if (GManager.instance.gameState == "")
{
if (Input.GetButtonDown("Submit"))
{
if (GManager.instance.talkId != "")
{
GManager.instance.gameState = "talk";
flowchart.SendFungusMessage(GManager.instance.talkId);
}
}
}
void talkEnd()
{
GManager.instance.gameState = "";
GManager.instance.talkId = "";
}
こんな感じでいけるんじゃないかな~。
とりあえずここまで。
👉 次の記事 Fungusの導入からカスタムまで(3)
