Unity導航Navigation和NavMeshComponents使用

基本概念

Navigation是Unity自帶的導航,具備了基本的Bake(烘焙)NavMesh(導航網格)和NavMashAgent(導航代理)等基本導航功能;而GitHub上的NavMeshComponents則是一套功能更強大的擴展了Navigation的工具。能做到更多例如動態烘焙,預設體和設置跳躍路徑等。

 

Navigation基本使用

  1. 烘焙尋路區域:打開Window→AI→Navigation窗口,然後選擇場景中可作爲角色移動的collider,設定Static爲Navigation Static,然後在Navigation窗口裏面Bake,地圖會出現藍色的面片表面是可移動區域。    
  2. 尋路代理控制器:給角色或AI添加NavMeshAgent組件用於角色控制,可以設定類型/移動速度/寬高等屬性 
  3. OfferMeshLink:連接2塊NavMesh,設置Star起始點和End結束點,則視爲可以在這2點間移動,多用於攀爬和跳躍。

 

基本變量和API

地址

 

常用變量和API

obstacleAvoidanceType = NoObstacleAvoidance : 設置不碰撞推擠

NavMeshAgent.destination = V3 :設置尋路目的地,並馬上移動;

NavMeshAgent.isStopped :啓動/停止尋路;

NavMeshAgent.pathPending :是否正在尋路;

NavMeshAgent.remainingDistance :與目的地距離

ResetPath :清空當前路徑。

Resume() :停止遊戲角色進行移動,並重新開始移動(原路徑)。

Wrap(V3) :將物體瞬移到目標點。

 

如何啓動NavMeshComponents

  1. 官方GitHub地址
  2. 版本要求:Unity 5.6 or newer
  3. Assets/NavMeshComponents複製到自己的項目內

 

NavMeshComponents Demo示例

  1. 1_multiple_agent_sizes:演示門的設定,讓不同大小的Agent只能通過適合自己大小的門。可以創建不同NavMeshSurface來制定不同的寬高等屬性的Agent,即可bake出不同的NavMesh 
  2. 2_drop_plank:動態烘焙運行時產生的木板,產生一個rigidbody木板isSleep後烘焙                                                     .   
  3. 3_free_orientation:自由設定重力方向
  4. 4_sliding_window_infinite:只動態烘焙角色一定距離內的區域,並且不斷刷新沙盒地圖
  5. 5_sliding_window_terrain:如上,但不刷新地圖
  6. 6_modify_mesh:動態改變mesh高度並烘焙                                                                                                   .                            
  7. 7_dungeon:地牢,引入了新的過度mesh方式-NavMeshLink可是設定一定長寬的導航路徑,比起MeshOfferLink更方便和更有效率,並可以通過角色上的AgentLinkMover來設定行動方式Teleport,NormalSpeed,Parabola,甚至Curve自定義曲線。    
  8. 7b_dungeon_tile_prefabs:使用導航預製體

 

一些問題和實驗

  1. AngularSpeed屬性無效, 解決方法一般是自己用代碼來控制旋轉。 [1]要設置Agent中的AngularSpeed爲0,或者代碼設置navmeshAgent的屬性updateRotation爲false [2]要禁用Animator的ApplyRootMotion
  2. 調用NavMeshagent.destination設置目標點,如果目標點是不可達的點,那麼結果是destination存放了離目標點最近的點。並且也會讓尋路者移動到最近點。移動到最近的點後,remainingDistance爲0。
  3. 調用NavMeshagent.destination設置目標點時,目標點的Y值將會被設置爲離agent最近的NavMesh的Y值。
  4. 設置NavMeshAgent的enable刷新位置,Unity內部會尋找NavMeshagent最近的NavMesh。最把它放在NavMesh上。
  5. 調用NavMeshagent.CalculatePath計算路徑是否可達,如果傳入了無效點path.status會顯示PathInvalid。如果點之間不可以到達顯示PathPartial,如果可達顯示PathComplete
  6. avoidancePriority越小,優先級越高,它會很不友好地把其它優先級低的物體給擠開
  7. NavMeshObstacle不能和NavMeshagent同時使用。否則物體將會試圖自己躲開自己。表現就是亂跳
  8. 總的來說,Unity尋路對動態物體躲避做得不好。如果avoidancePriority無法滿足需求的話,請選用astar pathing這種第三方插件。
  9. NavMeshAgent啓用的時候,CharacterController就不起作用。CharacterController在遇到有碰撞的障礙物時,會嘗試微調繞過物體。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章