基本概念
Navigation是Unity自帶的導航,具備了基本的Bake(烘焙)NavMesh(導航網格)和NavMashAgent(導航代理)等基本導航功能;而GitHub上的NavMeshComponents則是一套功能更強大的擴展了Navigation的工具。能做到更多例如動態烘焙,預設體和設置跳躍路徑等。
Navigation基本使用
- 烘焙尋路區域:打開Window→AI→Navigation窗口,然後選擇場景中可作爲角色移動的collider,設定Static爲Navigation Static,然後在Navigation窗口裏面Bake,地圖會出現藍色的面片表面是可移動區域。
- 尋路代理控制器:給角色或AI添加NavMeshAgent組件用於角色控制,可以設定類型/移動速度/寬高等屬性
- OfferMeshLink:連接2塊NavMesh,設置Star起始點和End結束點,則視爲可以在這2點間移動,多用於攀爬和跳躍。
基本變量和API
常用變量和API
obstacleAvoidanceType = NoObstacleAvoidance : 設置不碰撞推擠
NavMeshAgent.destination = V3 :設置尋路目的地,並馬上移動;
NavMeshAgent.isStopped :啓動/停止尋路;
NavMeshAgent.pathPending :是否正在尋路;
NavMeshAgent.remainingDistance :與目的地距離
ResetPath :清空當前路徑。
Resume() :停止遊戲角色進行移動,並重新開始移動(原路徑)。
Wrap(V3) :將物體瞬移到目標點。
如何啓動NavMeshComponents
- 官方GitHub地址
- 版本要求:Unity 5.6 or newer
- 把Assets/NavMeshComponents複製到自己的項目內。
NavMeshComponents Demo示例
- 1_multiple_agent_sizes:演示門的設定,讓不同大小的Agent只能通過適合自己大小的門。可以創建不同NavMeshSurface來制定不同的寬高等屬性的Agent,即可bake出不同的NavMesh
- 2_drop_plank:動態烘焙運行時產生的木板,產生一個rigidbody木板isSleep後烘焙 .
- 3_free_orientation:自由設定重力方向
- 4_sliding_window_infinite:只動態烘焙角色一定距離內的區域,並且不斷刷新沙盒地圖
- 5_sliding_window_terrain:如上,但不刷新地圖
- 6_modify_mesh:動態改變mesh高度並烘焙 .
- 7_dungeon:地牢,引入了新的過度mesh方式-NavMeshLink可是設定一定長寬的導航路徑,比起MeshOfferLink更方便和更有效率,並可以通過角色上的AgentLinkMover來設定行動方式Teleport,NormalSpeed,Parabola,甚至Curve自定義曲線。
- 7b_dungeon_tile_prefabs:使用導航預製體
一些問題和實驗
- AngularSpeed屬性無效, 解決方法一般是自己用代碼來控制旋轉。 [1]要設置Agent中的AngularSpeed爲0,或者代碼設置navmeshAgent的屬性updateRotation爲false [2]要禁用Animator的ApplyRootMotion
- 調用NavMeshagent.destination設置目標點,如果目標點是不可達的點,那麼結果是destination存放了離目標點最近的點。並且也會讓尋路者移動到最近點。移動到最近的點後,remainingDistance爲0。
- 調用NavMeshagent.destination設置目標點時,目標點的Y值將會被設置爲離agent最近的NavMesh的Y值。
- 設置NavMeshAgent的enable刷新位置,Unity內部會尋找NavMeshagent最近的NavMesh。最把它放在NavMesh上。
- 調用NavMeshagent.CalculatePath計算路徑是否可達,如果傳入了無效點path.status會顯示PathInvalid。如果點之間不可以到達顯示PathPartial,如果可達顯示PathComplete
- avoidancePriority越小,優先級越高,它會很不友好地把其它優先級低的物體給擠開
- NavMeshObstacle不能和NavMeshagent同時使用。否則物體將會試圖自己躲開自己。表現就是亂跳
- 總的來說,Unity尋路對動態物體躲避做得不好。如果avoidancePriority無法滿足需求的話,請選用astar pathing這種第三方插件。
- NavMeshAgent啓用的時候,CharacterController就不起作用。CharacterController在遇到有碰撞的障礙物時,會嘗試微調繞過物體。