ものづくりのブログ

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

【Unityで2DRPG】会話処理の修正 (猫の冒険)

Unity で 2DRPG 作りに奮闘してます。
今回は、これまで作成してきたゲーム(猫の冒険)で修正したい部分が出てきたので、少しずつ修正してみました。

修正したい部分

修正したいものを以下の表にまとめてみました。

現状 修正案
ジョイステックや会話ボタンがメッセージダイアログに重なる 会話中は非表示にする
会話ボタンをクリックしないと会話できない 接触したら会話
会話中もNPCが動いてしまう 会話中は動かない
会話してないのに近寄ると振り向いてしまう 会話するときのみ振り返る
NPCがお互い移動中に重なり合ってしまう NPCが重ならないようにする
NPCが移動できないエリアをすり抜けてしまう 移動可能エリアを設ける

コントローラがメッセージウィンドと重なり邪魔です。
f:id:a1026302:20201119170541j:plain

修正後の会話処理

会話中はメッセージウィンドウが消えるように修正しました。
f:id:a1026302:20201119170036g:plain
動画をアップロードしました。
www.youtube.com

設定メモ

移動できエリアを設定

NavMeshModifierで移動エリアの設定を行います。
a1026302.hatenablog.com
f:id:a1026302:20201123173619j:plain

会話中はジョイスティックを非表示にする処理を追加

会話開始時にコントローラーを非表示にして、会話終了時にコントローラを表示する処理を追加する。

    IEnumerator Talk()
    {   
        SetController(false); // コントローラ非表示
        GameManager.instance.dialogActive = true;

        flowChart.SendFungusMessage(message);
        yield return new WaitUntil(() => flowChart.GetExecutingBlocks().Count == 0);
        
        SetController(true); // コントローラ表示
        GameManager.instance.dialogActive = false;
    }
NPCが重ならないようにする

NPCとしてゲームオブジェクトにNavMeshAgentコンポーネントを追加する。

AddComponent > Navigation > Nav Mesh Agent

f:id:a1026302:20201123174918j:plain

会話中は動かない設定

NPCとPlayerの距離を算出して指定した閾値を超えた場合移動しないようにする。

        // Playerが近づくとNPCが止まるための処理
        float now = Vector2.Distance(transform.position, playerObj.transform.position);

        if(!GameManager.instance.dialogActive)
        {
            if (distance < now)
            {
                rigidBody.position += input * SPEED; //NPCの移動
            }
        }
        else{
            // NPCがplayerに振り向くための処理
            Vector2? vector = new Vector2( 
                (transform.position.x - playerObj.transform.position.x) * -1, 
                (transform.position.y - playerObj.transform.position.y) * -1
            );
            this.animator.SetFloat("x", vector.Value.x);
            this.animator.SetFloat("y", vector.Value.y);
        }