NavmeshAgentを使った順番に巡回&近づいたら巡回をやめてプレイヤーを追跡するスクリプト

開発環境
   // 追いかける対象の座標情報
   private Transform playerTransform;

   [SerializeField]
   [Tooltip("巡回する地点の配列")]
   private Transform[] waypointArray;

   [SerializeField]
   private NavMeshAgent _agent; 

   // 巡回する地点の開始ポイント
   private int currentWaypointIndex = 0;
   
   [SerializeField]
   private GameObject Player //追いかける対象

   //巡回をやめて追跡する際のトリガーの距離
   private float enemyDistance = 8.0f;

   void Start()
   {
       _agent.updateRotation = false;//状況によって
       _agent.updateUpAxis = false;//状況によって
       playerTransform = Player.transform;
   }

   private void FixedUpdate()
   {
    //プレイヤーとエージェントの距離
   float distance = Vector3.Distance(transform.position, playerTransform.transform.position);

       if (distance < enemyDistance)
       {
           //プレイヤーを追いかける
           _agent.destination = playerTransform.position;
       }
       else
       {
           if (_agent.pathStatus != NavMeshPathStatus.PathInvalid)
           {
               {
                   // 目的地点までの距離(remainingDistance)が目的地の手前までの距離(stoppingDistance)以下になったら
                   if (_agent.remainingDistance <= _agent.stoppingDistance)
                   {
                       // 目的地の番号を1更新(右辺を剰余演算子にすることで目的地をループさせれる)
                       currentWaypointIndex = (currentWaypointIndex + 1) % waypointArray.Length;
                       // 目的地を次の場所に設定
                       _agent.destination = waypointArray[currentWaypointIndex].position;
                   }
               }
           }
       }
   }
Code language: C# (cs)

以上がサンプルコード。基本的なNavmeshの導入、設定については省く。

追いかけて来る敵のオブジェクトにアタッチする。

_agentには対象のエージェント、waypointArrayにはシーンに配置した巡回させたいポイント、Playerには追跡対象のプレイヤーを指定する。

waypointについてはこんな感じで。

あとはNavmeshをBakeしたりインスペクターから設定を済ませれば動く。

コメント

タイトルとURLをコピーしました