您好,登錄后才能下訂單哦!
這篇文章主要介紹Unity動畫系統的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
角色的狀態機以0層作為主層,然后以待機作混合樹為中心進行切換。
主層中會有一些復雜一些的混合樹,通過參數調節做出動作融合,比如八方向Straft。
主層還有會一個節點專門用于Override,后續會提到。
在副層,用于非常規行為的動作融合,比如邊走邊打、邊走邊防御。 ?
動畫事件其實用得不多,主要在于標記動畫某一幀需要觸發什么邏輯的這種情況。比如RootMotion的拉扯等等。我更傾向于自己寫邏輯去計時而不是交給動畫事件。
動畫事件,在執行到動畫某一幀觸發事件。如果動畫過渡時可能會事件失效,更健壯的做法是自定義時間段。
狀態事件,狀態機的切換事件,但仍然是自己計算更加可靠簡單。
IK算法有多種,一般而言,性能好就用CCD,對效果有要求就用FRAB。具體實現網上有大量資料。
在開放世界中,會放置很多預先打好TAG的交互物件。比如攀爬的IK,計算觸發對象上最近的作用點,進行相應的IK操作。
IK如果想要做的自然還有很多corner case,比如身隨手動、bad zone等等。在GDC上有大量的資料可以查到。
Retarget就是一段動畫可以服用到別的模型上。
Unity可以基于節點名字進行retarget。隨手做一段clip都支持這個功能。
對于通用人型動畫humanoid則支持更友好一些,名字不一樣,依然可以通過avatar進行retarget。
如果想在別的形體也進行retarget,那么可以使用Morpheme中間件。
這里講幾套換裝方案
最簡單的是材質層面的換裝,比如換貼圖
dummypoint的方式也非常簡單,在做好的角色上做預制的掛點,然后換武器
靜態蒙皮,預先在模型上做好幾套蒙皮了的服裝,換裝的時候對mesh進行開關。
動態蒙皮,重新綁蒙皮的方式支持角色換衣服,只要基于同一套骨骼開發,然后換裝的時候重新賦值bone信息即可完成重新綁定蒙皮。如果使用一套材質還可以通過合并Mesh減少Drawcall。
支持捏臉,參考uma系統。原理就是先把做好的部位頂點拼接起來,并且蒙皮。捏臉也是對頂點骨骼進行操作。
用RootMotion能讓動畫更加自然(一些游戲滑步就是因為不會用RootMotion),也有很多項目會單獨把RootMotion單獨輸出美術路徑拆開使用。但是RootMotion是靜態的,對于動態的環境需要一些技巧來讓RootMotion更加自然。
對于動態位移的情況,我們經常會遇到RootMotion夠不到目的地的情況,那么對RootMotion最常用的操作就是將其縮放到合適的位移。
對于動態旋轉的情況,也會遇到RootMotion的旋轉角度不滿足游戲性的需要或者因為混合偏移了。一個做法就是通過融合參數將角度進行逼近來控制動畫旋轉到合適的角度。
一般而言,我們直接通過AnimatorOverrite就可以替換了。但是如果多個Override的動作之間需要過渡,那么Unity會導致角色穿地。可以使用下面這種方案,支持任意多個Override動畫過渡。
三個狀態機作為placeholder,每次替換都將還沒使用的節點替換出來,然后進行過渡。替換之后需要用Animator.Update來刷新一下。
好處就是提高單個AnimatorController復用率,減少動畫狀態以及初始化涉及的clip數量。
Unity的動畫系統很簡單,不支持復雜的狀態機,沒法在里面加入IK、物理之類的節點,也無法嵌套混合樹。這里可以最終動畫系統輸出之后,比如LateUpdate的方式,再進行一遍處理來調節骨骼。
dynamicbone,這個插件可以對指定的骨骼加入效果,從而讓某個骨骼有震蕩的效果。
puppet,這個插件的方案也是類似的。等動畫輸出之后,物理系統根據動畫的位置校正ragdoll,在物理碰撞之后,把ragdoll再反算回骨骼,從而讓角色動畫和物理環境很好地進行交互。
Animator初始化卡頓,Animator會把所有狀態的AnimationClip加載到內存,最佳方法是用Override減少不必要的加載。
動畫壓縮,可以自行預處理一遍,控制下精度能省不少空間。還可以考慮其他方法,比如省略通道、曲線退化、骨骼剔除等等。
以上是“Unity動畫系統的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。