2016-10-25 28 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」,這是一個遊戲對象

的問題就在這裏: 當路徑球員有0或1的角落,只要路徑中包含更多的資產淨值網狀代理將開始向玩家走的路徑,但...。比1角落,距離不會計算,因此返回agent.remainingDistance == float.PositiveInfinity

這意味着距離(即float.MaxValue)小於剩餘距離(float.PositiveInfity)。

我可能會忘記的任何事情?請告訴我。我總是可以提供更多細節。

+0

當距離未知時'NavMeshAgent.remainingDistance'將返回無窮大。你確定代理人和玩家總是在導航網站上嗎? – Serlite

+0

是的。我的團隊正在實施玩家控制的部分仍在努力。被標記爲玩家的對象不會移動,並且始終發生粘連。我可以將敵人放置在飛機上,可以走路的敵人和不能走的敵人都在同一個Y位置。 – Marcel

+1

在附註中,'remainingDistance'可能會在最初分配路徑之後才更新 - 嘗試在路徑分配後在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工作,請讓我知道。