日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Unity动画系统经验谈:换装系统与骨骼调节

發(fā)布時間:2024/8/26 windows 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity动画系统经验谈:换装系统与骨骼调节 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.




這里總結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。