Unity-導(dǎo)航網(wǎng)格代理與其他組件結(jié)合使用
您也可以將導(dǎo)航網(wǎng)格代理 (NavMesh Agent)、導(dǎo)航網(wǎng)格障礙物 (NavMesh Obstacle) 和網(wǎng)格外鏈接 (Off Mesh Link) 組件與其他 Unity 組件一起使用。此處列出了混用不同組件時的一些注意事項。
導(dǎo)航網(wǎng)格代理和物理組件
無需向?qū)Ш骄W(wǎng)格代理添加物理碰撞體來讓它們彼此避開
也就是說,導(dǎo)航系統(tǒng)會模擬代理及其對障礙物和靜態(tài)世界的反應(yīng)。此處所說的靜態(tài)世界是指烘焙的導(dǎo)航網(wǎng)格。
如果希望導(dǎo)航網(wǎng)格代理推開物理對象或使用物理觸發(fā)器:
啟用運動學(xué) (Is Kinematic) - 這很重要!
運動學(xué)意味著剛體由物理模擬以外的其他事物控制
添加碰撞體 (Collider) 組件(如果不存在)
添加剛體 (Rigidbody) 組件
如果導(dǎo)航網(wǎng)格代理和剛體(非運動學(xué))同時處于激活狀態(tài),表示存在競爭條件
兩個組件都可能嘗試移動相同位置的代理,從而導(dǎo)致不明行為
可使用導(dǎo)航網(wǎng)格代理移動玩家角色之類的代理,無需使用物理組件
將玩家代理的躲避優(yōu)先級設(shè)置為較小數(shù)字(高優(yōu)先級),從而允許玩家穿過群體
使用?NavMeshAgent.velocity?移動玩家代理,使其他代理能夠預(yù)測玩家的移動以避開玩家。
導(dǎo)航網(wǎng)格代理和動畫器
導(dǎo)航網(wǎng)格代理和帶有根運動的動畫器可能會導(dǎo)致競爭條件
兩個組件都嘗試在每幀移動變換
兩種可能的解決方案
信息應(yīng)始終朝一個方向流動
要么由代理移動角色并使動畫跟隨
要么根據(jù)模擬結(jié)果由動畫移動角色
否則,最終將發(fā)生難以調(diào)試的反饋循環(huán)
動畫跟隨代理
使用?NavMeshAgent.velocity?作為動畫器的輸入,從而將代理的移動大致匹配成動畫
強大且易于實現(xiàn),將導(dǎo)致腳滑(此情況下動畫無法與速度匹配)
代理跟隨動畫
禁用?NavMeshAgent.updatePosition?和?NavMeshAgent.updateRotation?以從游戲?qū)ο笪恢媒獬M
使用模擬代理的位置 (NavMeshAgent.nextPosition) 和動畫根 (Animator.rootPosition) 之間的差異來計算動畫的控制
有關(guān)更多詳細信息,請參閱耦合動畫和導(dǎo)航
導(dǎo)航網(wǎng)格代理和導(dǎo)航網(wǎng)格障礙物
不要混用!
同時啟用兩者將使代理嘗試避開自己
如果此外還啟用雕刻,則代理會嘗試不斷重新映射到雕刻孔的邊緣,甚至?xí)殡S出現(xiàn)更多錯誤行為
確保在任何給定時間只有其中一個為激活狀態(tài)
死亡狀態(tài),可關(guān)閉代理并開啟障礙物以迫使其他代理避開它
或者,可使用優(yōu)先級來更多地避開某些代理
導(dǎo)航網(wǎng)格障礙物和物理組件
如果希望物理控制的對象影響導(dǎo)航網(wǎng)格代理的行為
將導(dǎo)航網(wǎng)格障礙物組件添加到代理應(yīng)該知道的對象,這允許避讓系統(tǒng)推斷障礙物
如果游戲?qū)ο蟾郊恿藙傮w和導(dǎo)航網(wǎng)格障礙物,則自動從剛體獲得障礙物的速度
這可讓導(dǎo)航網(wǎng)格代理預(yù)測并避開移動的障礙物