前回まででFungusの基本的な使い方が分かったと思うので、さっそくNPCとの会話イベントを実装していきます。
NPCの作り方
では、ここからNPC用のゲームオブジェクトを準備していきましょう。
ThirdPersonCharacterスクリプトの改造
まずはじめに、NPCには直接関係ありませんが、会話イベントに入ったときにプレイヤーを停止させるための改造を行います。「ThirdPersonCharacter」スクリプトの適当な場所に、次の「Stop()」メソッドを追加してください。
public void Stop() { m_Rigidbody.velocity = Vector3.zero; m_Animator.SetFloat("Forward", 0); m_Animator.SetFloat("Turn", 0); m_Animator.SetBool("Crouch", false); }
NPCのC#スクリプトの作成
次にNPC用のキャラクターにアタッチするスクリプトを書きます。新しく「NpcController」というC#スクリプトファイルを作り、次のスクリプトを書いてください。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityStandardAssets.Characters.ThirdPerson; using Fungus; [RequireComponent(typeof(Flowchart))] public class NcpController : MonoBehaviour { [SerializeField] string message = ""; bool isTalking = false; GameObject playerObj; ThirdPersonCharacter player; ThirdPersonUserControl control; Flowchart flowChart; void Start() { playerObj = GameObject.FindGameObjectWithTag("Player"); player = playerObj.GetComponent<ThirdPersonCharacter>(); control = playerObj.GetComponent<ThirdPersonUserControl>(); flowChart = GetComponent<Flowchart>(); } void OnTriggerEnter(Collider other) { if(other.gameObject.CompareTag("Player")) { StartCoroutine(Talk()); } } IEnumerator Talk() { if (isTalking) { yield break; } isTalking = true; control.enabled = false; player.Stop(); flowChart.SendFungusMessage(message); yield return new WaitUntil(() => flowChart.GetExecutingBlocks().Count == 0); isTalking = false; control.enabled = true; } }
スクリプトの解説
プレイヤーがNPCに近づいたら(=トリガーに入ったら)、Talkというコルーチンを実行するようにしてあります。
この「Talk」コルーチンでは、フローチャートにメッセージ(※後述)を送信してブロックを開始し、実行するすべてのブロックが終了するまで処理を待つようにします。また、その間はプレイヤーのキャラクターコントローラーを無効化&移動停止することで、会話イベントが始まった時にプレイヤーがきちんと止まるようにします。
NPC用のゲームオブジェクトの作り方
そうしたら、NPC用のゲームオブジェクトを作っていきます。予めインポートしておいた3Dモデルに下の図のようにコライダーとトリガーをアタッチします。
この図ではボックスコライダーがすり抜け防止用のコライダー、スフィアコライダーがトリガーです。
そうしたら、次にこのゲームオブジェクトにFungusの「Flowchart」と、先ほど作った「NpcController」をそれぞれアタッチしましょう。
NpcControllerの「メッセージ」には、ここではテスト用として「test」と設定しておいてください。これでNPCのゲームオブジェクトの用意ができました。
会話イベントのテスト:メッセージを出してみる
これで準備ができたので、ちょっと試しにNPC(ここでは羊)にテスト用メッセージを表示させてみましょう。今回は初めて近づいた時と、2回目以降に近づいた時で別のメッセージを表示させることにします。
手順は次の通りです。
- NPCのキャラクター情報を設定する
- NPCのフローチャートを編集する
手順1:NPCのキャラクター情報を設定する
まずはキャラクター情報(名前、顔グラフィックなど)を登録する必要があります。メニューバーの「Tools」→「Fungus」→「Create」→「Character」を選択し、新しく作られたゲームオブジェクトに次の画像のように情報を登録します。
手順2:NPCのフローチャートを編集する
それができたら、次に羊キャラのフローチャートを編集していきます。NPCにアタッチされている「Flowchart」コンポーネントの「Open Flowchart Window」をクリックしてフローチャートウィンドウを開きます。
そうすると1つだけブロックがあるフローチャート画面が出ると思います。まず左下の「Variables」をクリックして、「isFirstTime」というBoolean(初期値はTrue)を作ってください。
次に最初からあるブロックをクリックするとインスペクターに内容が表示されるので、次のように編集します。
- 「Execute On Event」を「Message Recieved」に変更
- メッセージを「test」に変更(※NpcControllerに設定した文字列と同じにしてください)
- コマンドを下の図のように追加(右下の「+」マークからコマンドを追加できます)
これで
- 初めて近づいたとき:「こんにちは。これは初回表示のテストです。」
- 2回目以降に近づいたとき:「また会いましたね!これは2回目以降の表示のテストです。」
というメッセージが表示されます。
次のページ→会話イベントの作り方3:フローチャートの作成