ナビメッシュを使ってNPCに移動させる方法

投稿者: | 2019-10-29

NPCを目的地へ移動させる


Unityではナビメッシュを使うと、目的地を設定するだけで、NPCを移動させられます。障害物を避けながら最短経路を見つけます。

まず、床、NPC(緑色)、障害物(黄色)、目的地(黒色)を用意します。
このNPCはエージェントと呼ばれます。

目的地は、簡単に座標をエージェントに使えるために作ったSphereです。

各オブジェクトにナビメッシュ用のコンポーネントを追加していきます。
インスペクタのAdd Componentから、エージェントにはNav Mesh Agentを、障害物にはNav Mesh Obstacleをつけます。

障害物は、形を2種類から選べます。

床、障害物をすべて同時選択し、インスペクタのあるウィンドウの Navigationタブ -> Object でNavigation Staticにチェックをいれます。

そして、Bake の一番下にあるBakeボタンをクリックすると、ナビメッシュが作成されます。


青いところが、エージェントの歩ける場所です。余白はエージェントの半径に合わせて設定できます。

スクリプトを作る

エージェントに目的地を伝えるには、エージェントのオブジェクトに以下の短いスクリプトをつけます。

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

public class agentScript : MonoBehaviour
{
    public Transform point;

    // Start is called before the first frame update
    void Start()
    {
        NavMeshAgent agent = GetComponent<NavMeshAgent>();
        agent.destination = point.position;
    }

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

そして、エージェントのインスペクタで、目的地のオブジェクトをアタッチします。

すると、エージェントは勝手に最短経路で目的地へ向かい、障害物があれば自動で避けます。

目的地を複数作れば、簡単にNPCを巡回させることができます。
https://docs.unity3d.com/ja/2018.1/Manual/nav-AgentPatrol.html

プレイヤーを追いかけるNPC

コードを少し変えて、Update内でエージェントにプレイヤーの現在位置を教えると、エージェントはプレイヤーにずっとついてきます。

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

public class agentScript : MonoBehaviour
{
    public Transform point;
    public Transform player;
    NavMeshAgent agent;

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        //agent.destination = point.position;
    }

    // Update is called once per frame
    void Update()
    {
       agent.destination = player.position;
    }
}

プレイヤーを障害物に設定すれば、エージェントは移動するプレイヤーを避けながら目的地へ向かいます。

コメントを残す

メールアドレスが公開されることはありません。