[Unity6] Navigation入門:NavMeshAgentで敵をプレイヤーに追従させる方法。

(2025/02/17)
[Unity6] NavMeshAgentを使って、プレイヤーを追いかける敵の作り方。

開発環境
  • Unityのバージョン : 6000.0.36f1

  • 久しぶりにAI Navigationを使おうとしたら、使い方が変わっていたのでここに書き残しておきます。

    NavMeshの設定

    まず、下の画像のように床と壁を設置します。サイズは適当で大丈夫です。

    [Unity6] NavMeshAgentを使って、プレイヤーを追いかける敵の作り方。

    次に、床のオブジェクトに対してAdd Componentから「NavMesh Surface」を追加します。

    [Unity6] NavMeshAgentを使って、プレイヤーを追いかける敵の作り方。

    その後、NavMesh SurfaceのBakeをクリックします。下の画像のようになっていれば成功です。

    [Unity6] NavMeshAgentを使って、プレイヤーを追いかける敵の作り方。

    プレイヤーと敵を作成

    プレイヤー(青色のCapsule)と敵(赤色のCapsule)を作成し、シーンに追加します。

    [Unity6] NavMeshAgentを使って、プレイヤーを追いかける敵の作り方。

    敵オブジェクトにAdd Componentから「Nav Mesh Agent」を追加します。

    [Unity6] NavMeshAgentを使って、プレイヤーを追いかける敵の作り方。

    敵オブジェクトにEnemyAgentという名前のスクリプトを作成しアタッチした後、以下のコードをコピペします。

    using UnityEngine;
    using UnityEngine.AI;
    
    public class EnemyAgent : MonoBehaviour
    {
        private NavMeshAgent agent;
        public GameObject target;
    
        void Start()
        {
            agent = GetComponent<NavMeshAgent>();
        }
    
        void Update()
        {
            agent.destination = target.transform.position;
        }
    }
     
    

    次に、プレイヤーオブジェクトにRigidbodyを追加し、ConstraintsのFreeze Rotationにすべてチェックを入れます。 その後、Playerという名前のスクリプトを作成しアタッチした後、以下のコードをコピペします。

    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        public float moveForce = 10f;  // 移動の力
        public float maxSpeed = 5f;     // 最大速度
        private Rigidbody rb;
    
        void Start()
        {
            rb = GetComponent<Rigidbody>();
        }
    
        void FixedUpdate()
        {
            // 入力を取得
            float horizontalInput = Input.GetAxis("Horizontal"); // A, D, ←, →
            float verticalInput = Input.GetAxis("Vertical");   // W, S, ↑, ↓
    
            // 移動方向に力を加える
            Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput);
            rb.AddForce(movement * moveForce);
    
    
            // 最大速度制限 (ベクトルの大きさで制限)
            if (rb.linearVelocity.magnitude > maxSpeed)
            {
                rb.linearVelocity = rb.linearVelocity.normalized * maxSpeed;
            }
        }
    }
     
    

    エディターを実行すると、敵がプレイヤーを壁を避けて追いかけてきます。

    [Unity6] NavMeshAgentを使って、プレイヤーを追いかける敵の作り方。

    手軽に実装できるので、ぜひ導入してみてください。