敵の場合、x 秒ごとにナビゲーション メッシュにランダムな位置を設定して、敵がランダムに歩き回るようにします。ここに私のスクリプト:
ランダム ポイント (ユニティ ドキュメントから)
bool RandomPoint (Vector3 center, float range, out Vector3 result)
{
for (int i = 0; i < 30; i++) {
Vector3 randomPoint = center + Random.insideUnitSphere * range;
NavMeshHit hit;
if (NavMesh.SamplePosition (randomPoint, out hit, 1.0f, NavMesh.AllAreas)) {
result = hit.position;
return true;
}
}
result = Vector3.zero;
return false;
}
私のランダムな動きのスクリプト:
IEnumerator Walking ()
{
if (!isFollowingPlayer && isServer) {
Debug.LogError ("-- Start Walking --");
agent.speed = 2;
Vector3 randomDirection;
bool blocked = RandomPoint (agent.transform.position, walkRadius, out randomDirection);
NavMeshHit hit;
blocked = NavMesh.Raycast (enemy.transform.position, randomDirection, out hit, NavMesh.AllAreas);
if (!blocked) {
geileMethodeZumZeichnen (agent);
target = hit.position;
agent.SetDestination (hit.position);
geileMethodeZumZeichnen (agent);
Debug.LogWarning ("Go to " + hit.position);
}
if (blocked) {
Debug.LogWarning ("-- BLOCKED --");
yield return new WaitForEndOfFrame ();
} else {
Debug.LogWarning ("-- WAIT --");
yield return new WaitForSeconds (5f);
}
StartCoroutine ("Walking");
}
}
ランダム ウォーキングは一般的に機能します。ただし、ナビ メッシュ エージェントがナビ メッシュの境界に近づくと、エージェントが「ブレイクアウト」してその位置に固執しているように見えます。彼はナビゲーション メッシュの外で「ぐるぐる回る」だけです。(画像の赤い線:パス)
彼らは自分の位置に到達しようとしているように見えますが、再びナビ メッシュに入ることができません。私は彼らが最初に去ってほしくありません:)