まわ

勉強したことや遊びのこと

開発日誌::Unity+宴3で、アクションRPGで村人に近づいて話しかけて会話する という状況を想定したシーンの実装

f:id:k_mawa:20180227160547j:plain

コメント

村人に近づいて話しかける、それでクエストを発生させたり、選択肢によって進行を分岐させたりと、非常によく使う実装をした時の話をまとめました。

必要なもの や実施環境

宴は一家に1アセットあると何かと捗ると思いました。 有料で80ドルですが十分その価値はあるアセットだと思いますのでめっちゃお勧めしておきます。ノベルゲームだけではなく今回のようなアクションPRGやSLGで活用も手軽にできそうです^^

手順1:構成の概要

こんな感じです f:id:k_mawa:20180227160606j:plain

まず、主人公とCubeの距離を測ります。 それで、

if 主人公とCubeの距離 < 一定 かつ クリック=True
    { 会話呼び出し; } 

という感じの関数を実装していきたいと思います。

手順2:主人公とCubeの距離を測るコードの実装

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

public class conversation : MonoBehaviour {
    public GameObject objOne;
    public GameObject objTwo;
    bool One;
    bool Two;


    // Use this for initialization
    void Start () {
        //このOneとTwoを一回DebugLog呼び出したら
        //True,False切り替えるようにしておき、
        //1フレームごとに距離が出力されないようにしておきます
        //状態が変わったときだけDebugLogを吐き出すということです
        One = true;
        Two = true;

    }
    
    // Update is called once per frame
    void Update () {

        Vector3 OnePos = objOne.transform.position; //主人公キャラプレファブ
        Vector3 TwoPos = objTwo.transform.position;  //Cube(実践だとキャラクタープレファブ等を想定)
        float dis = Vector3.Distance(OnePos, TwoPos); //距離測定


        if (One)
        {
            if (dis >= 2) //主人公とCubeの距離が2以上なら
            {
                Debug.Log("Distance is over 2. far : " + dis);
                One = false;
                Two = true;
            }
        }

        if (Two)
        {
            if (dis < 2) //主人公とCubeの距離が2未満なら
            {
                Debug.Log("Distance is under 2. close : " + dis);
                Two = false;
                One = true;
            }
        }
 }

こんな感じですね。 挙動も見てみましょう。うまく思った通りの 挙動をしています。

手順3:宴のセッティング

ここからは宴を利用しますので、宴自体のセッティング(購入、インポートなど)が先に必要です。インポートした後は、下記の公式マニュアルにしたがって、ヒエラルキーに配置されている状態にしておいてください
会話シーンとして宴を使う | Unity用ビジュアルノベルツール「宴」

手順4:距離が近いときのクリックで会話ダイアログを呼ぶ

いよいよ核心部分の実装です。

#手順2と同じスクリプトです

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utage; //宴を忘れずに付加します

public class conversation : MonoBehaviour {
    //ここで宴のコントローラー的なオブジェクトを
    //呼び出す必要あります
    AdvEngine Engine { get { return engine ?? (engine = FindObjectOfType<AdvEngine>()); } }
    public AdvEngine engine;

//・・・(中略)・・・・

    void Update () {

        Vector3 OnePos = objOne.transform.position;
        Vector3 TwoPos = objTwo.transform.position;
        float dis = Vector3.Distance(OnePos, TwoPos);

        //・・・(手順2と重なるので中略)・・・・


        if (dis< 2) //主人公とCubeの距離が2未満なら
        {
            if (Input.GetMouseButtonDown(0)) //さらにマウスクリックがあったなら
            {
                Debug.Log("conversation start");
                StartCoroutine(CoTalk()); //会話シナリオを呼び出します
            }

        }

    }

    IEnumerator CoTalk()
    {
        //「宴」のシナリオ「Start」タグの会話シーンを呼び出す
        //会話をどのように構成するか、条件分岐、フラグ設定などは
        //なんと1つのエクセルでできてしまいます・・・
        //なお「Start」はデフォルトで入っているタグなので
        //設定しなくとも下記コードは動きます
        Debug.Log("call co talk");
        Engine.JumpScenario("Start");

        //「宴」のシナリオ終了待ち
        while (!Engine.IsEndScenario)
        {
            yield return 0;
        }
    }

挙動を見てみましょう。おお!いい感じ!

参考文献

宴3の活用方法リファレンス
会話シーンとして宴を使う | Unity用ビジュアルノベルツール「宴」

2オブジェクト間の距離を測る
blog.livedoor.jp