ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

Unityで2DのRPGを作る - [Fungus]を使って会話させる方法

Unityの2DRPGには村人などのNPCとの会話が重要と考えていたので、会話のさせ方を勉強してみました。

やりたいこと

  • 操作キャラクタとNPCに会話させたい

準備するもの

Unity のアセット「Fungus」

「Fungus」は 無料で使える会話イベントのエンジンのようです。
多機能のようでこれから少しずつ覚えていこうと思います。まずは基本的な会話のさせ方を学ぼうと思います。

操作できるキャラクターの設定

キャラクターの設定は以下のものを使用します。
a1026302.hatenablog.com

設定

[Fungus] インポート

[AssetStore]から[Fungus] を検索します。
assetstore.unity.com
[PackageManager]から[Fungus]を選択し[Import]ボタンをクリックします。
f:id:a1026302:20200908104041j:plain:h500
[Import Unity Package]のサブウィンドウが表示されるので[Import]ボタンをクリックします。
f:id:a1026302:20200908104242j:plain
[Assets]に[Fungus]と[FungusExamples]が追加されます。
f:id:a1026302:20200908120046j:plain
追加された2つのフォルダの主な内容です。

  • [Fungus] はフォントや[Fungus]のスクリプト
  • [FungusExamples] は[Fungus]で作られたサンプル

フローチャートを出して会話

「Flowchart」というGameObject作成

[Tools] -> [Fungus] -> [Create] -> [Flowchart] で作成します。
f:id:a1026302:20200908121459j:plain
[Hierarchy]に [Flowchart] が追加されます。

Flowchart作成

[Flowchart]を選択後、右側の[Inspector]タブから[Flowchar(Script)]の[Open Flowchart Window]ボタンをクリックします。
f:id:a1026302:20200909012015j:plain
[Flowchart]というサブウィンドウが表示されるので[New Block]というボタンをクリックします。
f:id:a1026302:20200909012721j:plain:h400
[Inspector]が以下のように切り替わります。
f:id:a1026302:20200909020636j:plain
右下の[+]をクリックして[Narrative] -> [Say]を選択します。
[Flowchart]の[Inspector]の[Commands]に[Say]が増えます。
[Say]を選択し[Story Text]にメッセージを入力します。
入力後動作確認してみます。
f:id:a1026302:20200909024615g:plain

NPCを配置して会話

「Guest」というゲームオブジェクト作成

テスト用NPCを配置します。
会話用のNPCを配置して[Guest]という名前に変更します。

「Guest」というゲームオブジェクトにコンポーネント追加

[Guest]を選択して[Inspector]タブから[Box Collider2D]を追加します。
f:id:a1026302:20200909100552j:plain
以下のスクリプトを準備します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Fungus;

[RequireComponent(typeof(Flowchart))]
public class NPCController : MonoBehaviour
{
	[SerializeField]
	string message = "";
	GameObject playerObj;
	Flowchart Flowchart;

	void Start()
	{
		playerObj = Gameobject.FindGameObjectWithTag("Player");
		flowChart = GetComponent<Flowchart>();
	}
    private void OnCollisionEnter2D(UnityEngine.Collision2D other)
    {
    	if (other.gameObject.tag == "Player")
    	{
    		StartCoroutine(Talk());
    	}
    }
    IEnumerator Talk()
    {
    	flowChart.SendFungusMessage(message);
    	yield return new WaitUntil(() => flowChart.GetExecutingBlocks().Count == 0);
    }
}

[Guest]というゲームオブジェクトに作成したスクリプトをアタッチします。
f:id:a1026302:20200909102417j:plain

「Guest」というゲームオブジェクトのタグを変更

プレイヤーの判断用に[Player]に[Player]タグを設定します。
f:id:a1026302:20200909101707j:plain

「Character」というゲームオブジェクト作成

[Tools] ->[Fungus] ->[Create] ->[Character]を選択し「Character」というゲームオブジェクトを作成します。
f:id:a1026302:20200909103705j:plain

「Character」設定

「Character」というゲームオブジェクトの「Character(Script)」というコンポーネントの[Name Text]を[Guest]に編集する。
「Character(Script)」というコンポーネントの「Portraits」という項目付近に画像をドラック&ドロップする。
画像が登録されたら[Elemet0]を確認する。
f:id:a1026302:20200909105043j:plain

フローチャート編集

[Guest]というゲームオブジェクトからフローチャートの編集を行います。
[Hierarchy]から[Guest]を選択して[Inspector]タブのスクリプトの[Message]に[会話練習]と入力します。
[Flowchart]の[Open Flowchart Window]ボタンをクリックします。
f:id:a1026302:20200909110454j:plain
[Flowchart]というサブウィンドウが表示されるので[New Block]をクリックします。
[Inspector]が切り替わるので、[Excute On Event]を[Message Received]にします。
[Message]に[会話練習]と入力します。
[+]ボタンをクリックして[Narrative/Say]を選択します。
[Character]を選択します。
[Story Text]に会話の内容を入力します。
f:id:a1026302:20200909111520j:plain

実行結果

なんとなく会話できてそうです。
youtu.be