天天看點

unity3d Mecanim武器骨骼動畫錯位解決方法

這幾天開始做遊戲中跟動畫相關的部分了,此次新項目我們決定一次從新開始,就是能用新的東西就都用新的東西,沒有必要總是把自己局限在之前的認知裡頭,是以此次我們大膽而又現實的采用了Unity 4.x版本新增的Mecanim動畫系統,并且我們果斷地又選擇了使用Humanoid動畫類型。好吧,一切從新開始。

一切從新開始就意味着會有很多新的坑需要自己一個個去填,我們一直都擁有一顆堅強受虐的心不是嗎。在我們的動畫設計師将骨骼動畫調好了之後,給了我一組FBX檔案,導入Unity之後,預覽一下這個動畫吧。

unity3d Mecanim武器骨骼動畫錯位解決方法
unity3d Mecanim武器骨骼動畫錯位解決方法

我們可以很明顯得看出這兩個動畫中人物角色的右手和武器之間的位置關系是不對的,跟動畫設計師在3DS Max中制作和預覽的效果也不對,好吧,碰到第一個坑,上吧。

通常我們先做的第一件事情就是先查查文檔,看看Unity官方是否有一些最佳實踐的建議,可是我翻遍了Unity Manual中關于Mecanim Animation System的所有文檔沒有看到相關的内容,而遊戲引擎通常對于開發者來說就是個黑盒,出了問題除了查檢視看别人是否碰到同樣的問題也就是直接找Support這條路了,或者就是自己各種嘗試呗。好吧,那就先Google一下吧,找啊找,找啊找,找了将近兩天看了很多跟Mecanim動畫相關的問題,但是就是沒有找到這個這麼基礎的問題相關的文章啥的,簡直沒有天理啊。

既然Humanoid不行,那我們試試Generic動畫吧,這下就都OK了,那麼顯然動畫資源自身肯定木有問題了,這下就确定肯定是Unity按照Humanoid動畫導入FBX資源的時候有某些設定我們沒有按照要求來做,是以導緻了這個武器完全不跟着右手骨骼運動的情況。自己糾結了又一天,又是各種查啊各種試,完全木有進展。最後,隻能求助于其他有經驗的人了,通過我們的動畫設計師,找到了一個他一個做技術美術的朋友,該大牛對Unity非常熟悉,專門解決項目中碰到的技術問題,哪裡有問題哪裡就有他。直接遠端協助一下,看着大神一點點地調整,先是檢查了一下Avatar設定中骨骼對應的關系是否正确,确認無誤之後,再次運作看看效果依然如此,大牛稍微思考了一下,馬上打開了Unity導入動畫的頁面,找到了Animations标簽頁,然後展開Mask設定中的Transform節點,将所有未勾選的人物角色骨骼節點都勾選上,然後Apply一下,再次運作遊戲,搞定。

unity3d Mecanim武器骨骼動畫錯位解決方法
unity3d Mecanim武器骨骼動畫錯位解決方法

再回顧一下完整的調整過程吧,首先我們要确定我們出問題的骨骼具體是哪根,因為目前看到的現象是右手拿的刀和挂在腰上的刀鞘出現了問題,打開Avatar設定頁面,檢視一下,确定是Bip001 Prop1和Bip001 Prop2這兩根骨骼出了問題。

unity3d Mecanim武器骨骼動畫錯位解決方法

确定了是這根骨骼出現問題了,然後進入到出現問題的動畫檔案[email protected]的導入設定頁面,打開Animations标簽頁 =》展開Mask節點 =》 展開Transform子節點 =》 找到左右手對應的刀和刀鞘的骨骼,勾選上,然後點選Apply按鈕就好了:

unity3d Mecanim武器骨骼動畫錯位解決方法
unity3d Mecanim武器骨骼動畫錯位解決方法
unity3d Mecanim武器骨骼動畫錯位解決方法

雖然大神幫我們解決了這個困擾了我将近4天的問題,那麼究竟為啥捏?其實在被困擾的4天裡頭,其實也發現了一些蛛絲馬迹的,就是每次我們導入動畫[email protected]的時候,Unity總會提示以下的警告:

MuscleClip ‘[email protected]’ conversion warning: Bone position is different in avatar and animation

‘Bip001 L Thigh’ : position error = 31.473890 mm

‘Bip001 R Thigh’ : position error = 8.405679 mm

‘Bip001 L Clavicle’ : position error = 37.673038 mm

‘Bip001 R Clavicle’ : position error = 76.461647 mm

UnityEditor.DockArea:OnGUI()

和這樣的一個警告:

MuscleClip ‘[email protected]’ conversion warning: ‘Bip001/Bip001 Pelvis’ is between humanoid transforms and has rotation animation. This might lower retargeting quality.

MuscleClip ‘[email protected]’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine’ has translation animation. It is not supported.

MuscleClip ‘[email protected]’ conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine’ is between humanoid transforms and has rotation animation. This might lower retargeting quality.

MuscleClip ‘[email protected]’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 L Thigh’ has translation animation. It is not supported.

MuscleClip ‘[email protected]’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 R Thigh’ has translation animation. It is not supported.

MuscleClip ‘[email protected]’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 Spine1/Bip001 Neck/Bip001 L Clavicle’ has translation animation. It is not supported.

MuscleClip ‘[email protected]’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 Spine1/Bip001 Neck/Bip001 R Clavicle’ has translation animation. It is not supported.

UnityEditor.DockArea:OnGUI()

這兩個警告大體的意思是啥呢,剛開始自己沒有太注意,後來總是找不到原因就想着會不會還就真是這倆警告給弄的呢,自己仔細看了一下。第一個警告的意思,應該說的是動畫中有幾個骨骼的位置跟這個動畫實際使用的Avatar中骨骼的位置不相符,這個原因我大概能了解的原因是這樣的。我們在制作的過程中會将模型檔案和動畫檔案分開,我在導入模型檔案的時候會建立一個屬于這個模型的Avatar,其他的動畫都會直接引用這個Avatar檔案而不會每個動畫都建立自己的Avatar,而不同的動畫中人物可以會有一些不同的動作,這就會讓動畫中角色的一些骨骼位置和模型(模型預設姿态就是站姿)站立姿态時的骨骼的位置會出現一些不比對的情況,是以這個可以了解了。那麼第二個警告呢,這個警告都是說某根骨骼有位移動畫和旋轉動畫,而這些動畫會降低Retargeting的品質,同時Humanoid動畫不支援在這些骨骼上使用位移動畫。雖然這個警告中提到的帶有位移和旋轉動畫的骨骼不少,但是涉及的就是角色軀幹、胸部、臀部、左右手、左右腳這幾個非常關鍵的骨骼,并沒有提到影響到刀和刀鞘的骨骼Bip001 Prop1和Bip001 Prop2啊。

綜合大神提供的解決方案,應該可以初步得出結論,導入FBX動畫的時候,選擇Humanoid動畫類型進行導入的時候,Unity會自行進行計算和判斷,然後根據Retargeting最佳原則,設定Animations頁籤中Mask節點下Transform子節點中的骨骼是否需要在Humanoid動畫中應用位移動畫,而這個時候Bip001 Prop1和Bip001 Prop2這倆骨骼就被忽略了,是以我們需要手動的去勾選,如果有必要的話,那麼就把所有的未勾選的骨骼都勾選上,然後再Apply一下吧,如果出現Apply一次不生效的話,重新重複設定遍,然後再Apply一下吧(我自己碰到了一次把所有的都勾選,然後Apply之後無效,重新展開之後發現隻有部分被勾選上了,重新再全勾選Apply一次才好的情況)。

剛才我們提到了使用Generic動畫的時候就不會出現這個問題對吧,那麼為了印證這個結論是否正确,我們可以檢查一下Generic動畫導入設定頁面中Animations标簽頁中Mask節點下Transform子節點中的骨骼節點是神馬情況就好了。如下圖,所有的節點預設都是勾選上的。

unity3d Mecanim武器骨骼動畫錯位解決方法

鑒于此,我們可以得出結論就是,在我們使用Humanoid動畫類型導入FBX檔案時,Unity會以最佳比對Retargeting規則的方式自行計算,看看那些骨骼是需要勾選Transform動畫選項的,而預設使用Generic動畫就會将所有的骨骼節點Transform動畫選項都勾選上,是以效果是正确的。OK,是以問題到這裡就徹底明了了。