http://7dot9.com/2014/08/16/unity3d-mecanim%E5%8A%A8%E7%94%BB%E7%B3%BB%E7%BB%9F%E9%AA%A8%E9%AA%BC%E5%8A%A8%E7%94%BB%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/
這幾天開始做游戲中跟動畫相關的部分了,此次新項目我們決定一次從新開始,就是能用新的東西就都用新的東西,沒有必要總是把自己局限在之前的認知里頭,所以此次我們大膽而又現實的采用了 Unity 4.x 版本新增的 Mecanim 動畫系統,並且我們果斷地又選擇了使用 Humanoid 動畫類型。好吧,一切從新開始。
一切從新開始就意味着會有很多新的坑需要自己一個個去填,我們一直都擁有一顆堅強受虐的心不是嗎。在我們的動畫設計師將骨骼動畫調好了之后,給了我一組 FBX 文件,導入 Unity 之后,預覽一下這個動畫吧。
我們可以很明顯得看出這兩個動畫中人物角色的右手和武器之間的位置關系是不對的,跟動畫設計師在 3DS Max 中制作和預覽的效果也不對,好吧,碰到第一個坑,上吧。
通常我們先做的第一件事情就是先查查文檔,看看 Unity 官方是否有一些最佳實踐的建議,可是我翻遍了 Unity Manual 中關於 Mecanim Animation System 的所有文檔沒有看到相關的內容,而游戲引擎通常對於開發者來說就是個黑盒,出了問題除了查查看看別人是否碰到同樣的問題也就是直接找 Support 這條路了,或者就是自己各種嘗試唄。好吧,那就先 Google 一下吧,找啊找,找啊找,找了將近兩天看了很多跟 Mecanim 動畫相關的問題,但是就是沒有找到這個這么基礎的問題相關的帖子啥的,簡直沒有天理啊。
既然 Humanoid 不行,那我們試試 Generic 動畫吧,這下就都 OK 了,那么顯然動畫資源自身肯定木有問題了,這下就確定肯定是 Unity 按照 Humanoid 動畫導入 FBX 資源的時候有某些設置我們沒有按照要求來做,所以導致了這個武器完全不跟着右手骨骼運動的情況。自己糾結了又一天,又是各種查啊各種試,完全木有進展。最后,只能求助於其他有經驗的人了,通過我們的動畫設計師,找到了一個他一個做技術美術的朋友,該大牛對 Unity 非常熟悉,專門解決項目中碰到的技術問題,哪里有問題哪里就有他。直接遠程協助一下,看着大神一點點地調整,先是檢查了一下 Avatar 設置中骨骼對應的關系是否正確,確認無誤之后,再次運行看看效果依然如此,大牛稍微思考了一下,馬上打開了 Unity 導入動畫的頁面,找到了 Animations 標簽頁,然后展開 Mask 設置中的 Transform 節點,將所有未勾選的人物角色骨骼節點都勾選上,然后 Apply 一下,再次運行游戲,搞定。
再回顧一下完整的調整過程吧,首先我們要確定我們出問題的骨骼具體是哪根,因為目前看到的現象是右手拿的刀和掛在腰上的刀鞘出現了問題,打開 Avatar 設置頁面,查看一下,確定是 Bip001 Prop1 和 Bip001 Prop2 這兩根骨骼出了問題。
確定了是這根骨骼出現問題了,然后進入到出現問題的動畫文件 jin_wei_jun@run.FBX 的導入設置頁面,打開 Animations 標簽頁 =》展開 Mask 節點 =》展開 Transform 子節點 =》找到左右手對應的刀和刀鞘的骨骼,勾選上,然后點擊 Apply 按鈕就好了:
雖然大神幫我們解決了這個困擾了我將近 4 天的問題,那么究竟為啥捏?其實在被困擾的 4 天里頭,其實也發現了一些蛛絲馬跡的,就是每次我們導入動畫 jin_wei_jun@run.FBX 的時候,Unity 總會提示以下的警告:
MuscleClip ‘jin_wei_jun@run’ 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 mmUnityEditor.DockArea:OnGUI()
和這樣的一個警告:
MuscleClip ‘jin_wei_jun@run’ conversion warning: ‘Bip001/Bip001 Pelvis’ is between humanoid transforms and has rotation animation. This might lower retargeting quality.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine’ has translation animation. It is not supported.
MuscleClip ‘jin_wei_jun@run’ conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine’ is between humanoid transforms and has rotation animation. This might lower retargeting quality.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 L Thigh’ has translation animation. It is not supported.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 R Thigh’ has translation animation. It is not supported.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 Spine1/Bip001 Neck/Bip001 L Clavicle’ has translation animation. It is not supported.
MuscleClip ‘jin_wei_jun@run’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 子節點中的骨骼節點是神馬情況就好了。如下圖,所有的節點默認都是勾選上的。
鑒於此,我們可以得出結論就是,在我們使用 Humanoid 動畫類型導入 FBX 文件時,Unity 會以最佳匹配 Retargeting 規則的方式自行計算,看看那些骨骼是需要勾選 Transform 動畫選項的,而默認使用 Generic 動畫就會將所有的骨骼節點 Transform 動畫選項都勾選上,所以效果是正確的。OK,所以問題到這里就徹底明了了。
本條目發布於2014年8月16日。屬於Programming、Unity3D分類,被貼了 Mecanim、Unity3D 標簽。