Unity动画系统经验谈:换装系统与骨骼调节
這里總結(jié)一下,自己使用Unity以來的心得,大部分屬于隨手解決但還有印象或者覺得效果不錯。
狀態(tài)機(jī)與狀態(tài)機(jī)設(shè)計
?
角色的狀態(tài)機(jī)以0層作為主層,然后以待機(jī)作混合樹為中心進(jìn)行切換。
?
主層中會有一些復(fù)雜一些的混合樹,通過參數(shù)調(diào)節(jié)做出動作融合,比如八方向Straft。
?
主層還有會一個節(jié)點專門用于Override,后續(xù)會提到。
?
在副層,用于非常規(guī)行為的動作融合,比如邊走邊打、邊走邊防御。
動畫事件
動畫事件其實用得不多,主要在于標(biāo)記動畫某一幀需要觸發(fā)什么邏輯的這種情況。比如RootMotion的拉扯等等。我更傾向于自己寫邏輯去計時而不是交給動畫事件。
動畫事件,在執(zhí)行到動畫某一幀觸發(fā)事件。如果動畫過渡時可能會事件失效,更健壯的做法是自定義時間段。
狀態(tài)事件,狀態(tài)機(jī)的切換事件,但仍然是自己計算更加可靠簡單。
IK
IK算法有多種,一般而言,性能好就用CCD,對效果有要求就用FRAB。具體實現(xiàn)網(wǎng)上有大量資料。
在開放世界中,會放置很多預(yù)先打好TAG的交互物件。比如攀爬的IK,計算觸發(fā)對象上最近的作用點,進(jìn)行相應(yīng)的IK操作。
IK如果想要做的自然還有很多corner case,比如身隨手動、bad zone等等。在GDC上有大量的資料可以查到。
Retarget
?
Retarget就是一段動畫可以服用到別的模型上。
Unity可以基于節(jié)點名字進(jìn)行retarget。隨手做一段clip都支持這個功能。
對于通用人型動畫humanoid則支持更友好一些,名字不一樣,依然可以通過avatar進(jìn)行retarget。
如果想在別的形體也進(jìn)行retarget,那么可以使用Morpheme中間件。
換裝系統(tǒng)
?
這里講幾套換裝方案
最簡單的是材質(zhì)層面的換裝,比如換貼圖
dummypoint的方式也非常簡單,在做好的角色上做預(yù)制的掛點,然后換武器
靜態(tài)蒙皮,預(yù)先在模型上做好幾套蒙皮了的服裝,換裝的時候?qū)esh進(jìn)行開關(guān)。
動態(tài)蒙皮,重新綁蒙皮的方式支持角色換衣服,只要基于同一套骨骼開發(fā),然后換裝的時候重新賦值bone信息即可完成重新綁定蒙皮。如果使用一套材質(zhì)還可以通過合并Mesh減少Drawcall。
支持捏臉,參考uma系統(tǒng)。原理就是先把做好的部位頂點拼接起來,并且蒙皮。捏臉也是對頂點骨骼進(jìn)行操作。
RootMotion
?
用RootMotion能讓動畫更加自然(一些游戲滑步就是因為不會用RootMotion),也有很多項目會單獨(dú)把RootMotion單獨(dú)輸出美術(shù)路徑拆開使用。但是RootMotion是靜態(tài)的,對于動態(tài)的環(huán)境需要一些技巧來讓RootMotion更加自然。
對于動態(tài)位移的情況,我們經(jīng)常會遇到RootMotion夠不到目的地的情況,二手QQ買號平臺那么對RootMotion最常用的操作就是將其縮放到合適的位移。
對于動態(tài)旋轉(zhuǎn)的情況,也會遇到RootMotion的旋轉(zhuǎn)角度不滿足游戲性的需要或者因為混合偏移了。一個做法就是通過融合參數(shù)將角度進(jìn)行逼近來控制動畫旋轉(zhuǎn)到合適的角度。
Override
一般而言,我們直接通過AnimatorOverrite就可以替換了。但是如果多個Override的動作之間需要過渡,那么Unity會導(dǎo)致角色穿地??梢允褂孟旅孢@種方案,支持任意多個Override動畫過渡。
三個狀態(tài)機(jī)作為placeholder,每次替換都將還沒使用的節(jié)點替換出來,然后進(jìn)行過渡。替換之后需要用Animator.Update來刷新一下。
好處就是提高單個AnimatorController復(fù)用率,減少動畫狀態(tài)以及初始化涉及的clip數(shù)量。
物理動畫
?
Unity的動畫系統(tǒng)很簡單,不支持復(fù)雜的狀態(tài)機(jī),沒法在里面加入IK、物理之類的節(jié)點,也無法嵌套混合樹。這里可以最終動畫系統(tǒng)輸出之后,比如LateUpdate的方式,再進(jìn)行一遍處理來調(diào)節(jié)骨骼。
dynamicbone,這個插件可以對指定的骨骼加入效果,從而讓某個骨骼有震蕩的效果。
puppet,這個插件的方案也是類似的。等動畫輸出之后,物理系統(tǒng)根據(jù)動畫的位置校正ragdoll,在物理碰撞之后,把ragdoll再反算回骨骼,從而讓角色動畫和物理環(huán)境很好地進(jìn)行交互。
性能問題
Animator初始化卡頓,Animator會把所有狀態(tài)的AnimationClip加載到內(nèi)存,最佳方法是用Override減少不必要的加載。
動畫壓縮,可以自行預(yù)處理一遍,控制下精度能省不少空間。還可以考慮其他方法,比如省略通道、曲線退化、骨骼剔除等等。
總結(jié)
以上是生活随笔為你收集整理的Unity动画系统经验谈:换装系统与骨骼调节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于RadeonRays的光线追踪全局光
- 下一篇: 利用AI技术自动测试游戏