0
敵に対しては、敵がランダムに散歩するように、ナビゲーションメッシュにランダムな位置をx秒ごとに設定します。ここに私のスクリプト:NavMeshAgentはNavMeshをスタック(外)しました
(ユニティ・ドキュメントから)ランダムポイント
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");
}
}
ランダム歩行は、一般的に動作します。しかし、ナビゲーションメッシュのエージェントがナビゲーションメッシュの境界線の近くにあるとき、彼は「壊れている」ように見え、その後彼の位置に固執しているように見えます。彼はnavメッシュの外側でのみ "周囲を震えます"。 (画像上の赤線:パス)
彼らは彼らの位置に到達しようとしたが、再びのnavメッシュを入力することはできませんように見えます。私はそれらを最初に残したくありません。
こんにちは、私は "geileMethodeZumZeichnen(エージェント)"関数が何をしているのか分かりません。とにかく、私が見る唯一の問題は、あなたがコルーチンの内側に歩行コルーチンを呼んでいることです(私はコルーチンが主なものが終わったときに停止すると信じています)。最後に、エージェントのターゲットを見るためのデバッグ行を描画していると思います。もしそうでなければ、それを行うべきです。ありがとう。 – Cabrra
申し訳ありませんが、ええ、まさにその方法が何をしています。私の変数 "ブロック"は - "方法がブロックされている"ことを意味するので、別の点を計算するためにもう一度呼び出します – Mirco
これは愚かな質問かもしれません。しかし、なぜあなたはUpdate()でwalkを呼び出さないのですか?それはあまり最適でなく、プロセッササイクルを浪費することがあります。しかし、私は、yiuがコロチンの内部でコルーチンを呼び出すと、最初のコルーチンが終了すると2番目のコルーチンが停止すると思います。 (最初のものには無限ループがあります)。あなたがこれを理解しているかどうかわからない... :(ごめんなさい – Cabrra