開発環境
- Unity 2022.3.45f1
- AI Navigation 1.1.5
- NavMeshPlus
- 2D
// 追いかける対象の座標情報
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したりインスペクターから設定を済ませれば動く。
コメント