2016-10-25 7 views
0

В настоящее время я работаю над игрой Unity3D, и у меня возникли проблемы с агентами навигационной сети. Моя текущая цель - заставить врагов идти к ближайшему игроку (будет 3). Один я создаю врага, который проверяет, кто из ближайших игроков. Это делается с оставшимся расстоянием по отношению к игроку, как показано в коде нижеUnity - NavMeshAgent не работает с несколькими углами

agent.CalculatePath(player.transform.position, path); 
agent.Stop(); 
agent.SetPath(path); 

if (distance > agent.remainingDistance) 
{ 
    distance = agent.remainingDistance; 
    playerToFollow = player; 
} 

В этом фрагменте расстояние будет начинаться «float.MaxValue» и (всякий раз, когда игрок находится ближе, чем текущее расстояние быть установлено как " . playerToFollow», который является GameObject

проблема заключается здесь:. Когда путь к плееру имеет 0 или 1 углы агент нав сетки начнет ходить свой путь к игроку, НО ... когда путь содержит больше. чем 1 угол, расстояние не будет рассчитываться, таким образом, возвращается agent.remainingDistance == float.PositiveInfinity.

это означает, что расстояние (это float.MaxValue) меньше, чем оставшееся расстояние (float.PositiveInfity).

Любые вещи, которые я мог бы забыть? Пожалуйста, дайте мне знать. Я всегда могу предоставить более подробную информацию.

+0

'NavMeshAgent.remainingDistance' вернет бесконечность, когда расстояние неизвестно. Вы уверены, что и агент, и игрок всегда находятся на navmesh? – Serlite

+0

Да. Часть моей команды, которая осуществляет контроль над игроками, все еще работает над этим. Объекты, помеченные как игроки, не перемещаются и всегда забиваются. Враги я могу разместить икру на самолете, и оба врага, которые могут ходить, и которые не могут находиться в одной позиции Y. – Marcel

+1

На стороне примечания, возможно, что 'оставшееся сопротивление 'не обновляется до тех пор, пока кадр после назначения пути не будет назначен - попробуйте проверить его в методе' Update() 'после того, как путь назначен (если эта проверка в настоящее время выполняется один раз) и посмотреть, изменится ли его значение на что-то более полезное. В противном случае вы можете придерживаться существующего решения, если оно работает приемлемо. – Serlite

ответ

0

Я исправил его, не используя расстояние в агенте. Теперь я использую углы пути и вычисляю расстояние между ними.

players.ForEach(
     player => 
     { 
      agent.CalculatePath(player.transform.position, path); 
      float pathDistance = calculatePathDistance(path); 

      if (pathDistance < distance) 
      { 
       distance = pathDistance; 
       playerToFollow = player; 
      } 

     } 
    ); 

с реализацией #calculatePathDistance (пути NavMeshPath) похожение:

private float calculatePathDistance(NavMeshPath path) 
{ 
    float distance = .0f; 
    for (var i = 0; i < path.corners.Length -1; i++) 
    { 
     distance += Vector3.Distance(path.corners[i], path.corners[i + 1]); 
    } 
    return distance; 
} 

Если у вас есть способ, где работает agent.remainingDistance, пожалуйста, дайте мне знать.

 Смежные вопросы

  • Нет связанных вопросов^_^