2016-07-02 15 views
0

Для врагов я устанавливал случайную позицию в навигационной сетке каждые x секунд, чтобы враги случайно шли вокруг. Вот мои скрипты:NavMeshAgent застрял (снаружи) NavMesh

Случайная точка (из Docs единства)

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"); 
    } 
} 

случайная ходьба обычно работает. Однако, когда агент навигационной сети близок к границе навигационной сетки, кажется, что он «вырывается» и затем придерживается своего положения. Он только «дрожит» вне навигационной сетки. (красные линии на изображении: путь)

NavMesh

Похоже, они пытаются достичь своей позиции, но не может войти в навигационную сетку снова. Я не хочу, чтобы они ушли на первое место :)

+0

Здравствуйте, fgirst of all, я не знаю, что делает функция geileMethodeZumZeichnen (agent). Во всяком случае, единственная проблема, которую я вижу, это то, что вы вызываете сопрограмму прохода внутри сопрограммы (я считаю, что сопрограмма останавливается, когда заканчивается главный). Последнее, я думаю, вы рисуете линии отладки, чтобы увидеть цели агентов. Если нет, вы должны это сделать. Благодарю. – Cabrra

+0

Извините, да, именно это и делает метод. Моя переменная «заблокирована» означает «путь заблокирован», поэтому я вызываю это снова, чтобы вычислить другую точку. – Mirco

+0

Это может быть глупый вопрос. Но почему бы вам не позвонить в Update()? Это может быть менее оптимальным и израсходовать процессорные циклы. Но я думаю, что когда yiu вызывает сопрограмму внутри коротина, вторая сопрограмма останавливается, когда заканчивается первая. (unles у вас есть бесконечный цикл в первом). Я не знаю, понимаете ли вы это ... :(sorry – Cabrra

ответ

0

В конце концов, это было довольно легко: Я не правильно настроил физику. Враги действительно «почувствовали» себя в краю и застряли там из-за физики. Теперь как шарм.