2016-07-02 3 views
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メッシュの外側でのみ "周囲を震えます"。 (画像上の赤線:パス)

NavMesh

彼らは彼らの位置に到達しようとしたが、再びのnavメッシュを入力することはできませんように見えます。私はそれらを最初に残したくありません。

+0

こんにちは、私は "geileMethodeZumZeichnen(エージェント)"関数が何をしているのか分かりません。とにかく、私が見る唯一の問題は、あなたがコルーチンの内側に歩行コルーチンを呼んでいることです(私はコルーチンが主なものが終わったときに停止すると信じています)。最後に、エージェントのターゲットを見るためのデバッグ行を描画していると思います。もしそうでなければ、それを行うべきです。ありがとう。 – Cabrra

+0

申し訳ありませんが、ええ、まさにその方法が何をしています。私の変数 "ブロック"は - "方法がブロックされている"ことを意味するので、別の点を計算するためにもう一度呼び出します – Mirco

+0

これは愚かな質問かもしれません。しかし、なぜあなたはUpdate()でwalkを呼び出さないのですか?それはあまり最適でなく、プロセッササイクルを浪費することがあります。しかし、私は、yiuがコロチンの内部でコルーチンを呼び出すと、最初のコルーチンが終了すると2番目のコルーチンが停止すると思います。 (最初のものには無限ループがあります)。あなたがこれを理解しているかどうかわからない... :(ごめんなさい – Cabrra

答えて

0

さて、これは最後にかなり簡単でした: 私は物理を正しく設定しませんでした。敵は実際にはエッジの中に感じられ、物理学のためにそこに詰まってしまった。今の魅力のように働く。

関連する問題