2016-10-25 5 views
0

현재 Unity3D 게임에서 작업 중이며 Nav Mesh 에이전트에 문제가 있습니다. 나의 현재 목표는 적을 가장 가까운 플레이어쪽으로 걸어 가게하는 것입니다 (3이 될 것입니다). 하나는 내가 적을 스폰합니다. 플레이어 중 가장 가까운 플레이어를 확인합니다. 거리가 'float.MaxValue'에서 시작되며, 플레이어가 현재 거리보다 가까운 때마다 ('로 설정됩니다이 조각에서Unity - NavMeshAgent가 여러 코너에서 작동하지 않습니다.

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

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

아래의 코드에서 볼 수 있듯이 이것은 플레이어를 향해 남은 거리 이루어집니다 . 게임 오브젝트입니다 playerToFollow ',

문제는 여기에있다 :. 플레이어의 경로가 0 또는 1 모서리가있는 경우 경로가 더 포함 할 때마다 는 탐색 메쉬 에이전트는 ... 플레이어 향해 길을 걷기 시작하지만 것입니다. 1을 초과하면 거리가 계산되지 않으므로 agent.remainingDistance == float.PositiveInfinity을 반환합니다.

이것은 거리 (float.MaxValue)가 남은 거리 (float.PositiveInfity)보다 작음을 의미합니다.

내가 잊을지도 모르는 것들? 저에게 알려주세요. 언제나 자세한 내용을 제공 할 수 있습니다.

+0

'NavMeshAgent.remainingDistance'는 거리를 알 수 없을 때 무한대를 반환합니다. 에이전트와 플레이어가 항상 navmesh에 있다는 것을 확신합니까? – Serlite

+0

예. 플레이어 컨트롤을 구현중인 팀원 중 일부가 아직 작업 중입니다. 플레이어로 태그 ​​된 객체는 움직이지 않고 항상 그루브를 만듭니다. 적군은 비행기에 산란 할 수 있고 걸을 수 있고 뛸 수없는 적들은 같은 Y 위치에 있습니다. – Marcel

+1

부수적으로,'remainingDistance'는 경로가 처음 할당 된 후 프레임이 업데이트 될 때까지 업데이트되지 않을 가능성이 있습니다 - 경로가 할당 된 후'Update()'메소드에서 검사를 시도하십시오 (이 검사가 현재 완료된 경우에만). 한 번), 가치가 더 유용한 것으로 바뀌는 지 확인하십시오. 그렇지 않으면 기존 솔루션을 그대로 사용할 수 있습니다. – Serlite

답변

0

상담원의 거리를 사용하지 않고 고정했습니다. 지금은 경로 모서리를 사용하고 그 사이의 거리를 계산하고 있습니다. 같이있는 #calculatePathDistance (NavMeshPath 경로)의 구현

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

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

     } 
    ); 

: 당신이 agent.remainingDistance 작동 방법이있는 경우

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

알려 주시기 바랍니다.