Unity中的NavMeshAgent的remainingDistance問題
在Unity官方案例中,要讓某個人物移動到某個地方,一般來說都是下面這樣的代碼:
agent.SetDestination(position);
要判斷是否停止的話,在《Unity官方案例精講》里面提到可以用remainingDistance來判斷移動是否結束,remainingDistance也就是(距離終點)剩余移動距離,讓它跟stopingDistance(結束距離)進行比較,如果小於,那么就是移動終止了,類似下面這樣的代碼.
agent.SetDestination(position);
if(agent.remainingDistance < agent.stoppingDistance){
// 移動終止
Debug.log("移動結束了");
}
但實際上,上面的代碼是有弊端的.....這就是最坑的地方啊!!!!!!!!!!!
事實上,使用SetDestination后,remainingDistance不是立刻更新的,因為agent還要計算距離什么的,所以此時的remainingDistance=0,所以上述代碼中即使沒有移動結束,依然會打印"移動結束"........被坑了差不多半學期吧,一直沒去想有什么更好的解決辦法,一直都是按照書上講的寫....看來以后還是不能盲從書上的東西.
那么如何解決這個問題呢,事實上,NavMeshAgent里面有個pathPending屬性,它英文解釋是:
Is a path in the process of being computed but not yet ready? (Read Only)
表示一個路徑是否還沒准備完畢並且正在計算中.如果已經准備完畢,返回True,否則返回False,這個正在計算中也就是我們使用SetDestination之后那一段"空白時間"(也就是remainingDistance沒有更新的那一段時間),所以正確的判斷移動是否結束的代碼應該是下面這樣:
agent.SetDestination(position);
if(!agent.pathPending && agent.remainingDistance < agent.stoppingDistance){
// 移動終止
Debug.log("移動結束了");
}