Unity動畫系統詳解6:如何做好角色的移動動畫?(Root Motion詳解)

摘要:Root Transform是body transform在Y平面上的投影,並且是運行時計算的。每一幀Root Transform的變化實時計算。然後Transform的變化會被應用到GameObject上從而讓物體移動。

洪流學堂,讓你快人幾步。你好,我是跟着大智學Unity的萌新,我叫小新,這幾週一起來複(yu)習(xi)動畫系統。

“智哥,自從用了混合樹來做人物移動,腰不酸腿不疼,思路更清晰了,一口氣能寫12小時代碼!”

“喲,療效這麼好,我看你應該再碼12個小時”

“那也沒問題,你來看看我做的這個人物的混合樹是不是棒極了”

小新信心滿滿地打開混合樹,給大智看。

“嗯,這個混合樹確實做的不錯,不過你這個角色還不能用啊!”

“怎麼不能用了,你看這個走起來不是走的好好的麼?”

“你走到那個坡上去試試”

小新操作人物往坡上走,只見直接穿了進去。

“哎?我好像忘了給人物加碰撞了,等我給他加上”

小新給角色加上Collider和Rigidbody組件,再次操作人物往坡上懟過去。

“智哥,你看現在OK了吧?”

“別急,你再下坡看看”

“哎,這怎麼不受重力啊,怎麼不會掉下去!明明加了剛體組件啊”

“這個是因爲動畫在控制人物的Y軸,所以纔沒有掉下去”

“但是我不都設置Apply Root Motion了麼,咋還這樣呢?”

“那你知道Root Motion到底是什麼?”

“那不就是……人物的動畫會帶動人物移動嘛”

“這只是他的一個表現,這時候你該去好好理解下Root Motion到底是什麼了,這個Unity的文檔中有,你去好好看一下吧!”

“好嘞”

下面是小新的學習筆記。

Root Motion

首先要分清Body Transform和Root Transform。

Body Transform(身體變換)

Body Transform是角色的質心(重心)。用於Mecanim系統的重定向引擎中來提供穩定的模型移動。身體朝向是角色模型在T姿勢下上身和下身朝向的平均值。

Body Transform和朝向存儲在Animation Clip中,這兩個是Animation Clip中存儲的唯二世界空間的曲線,其他的動畫曲線都是以相對body transform的形式存儲的。

T-Pose T姿勢
角色模型的胳膊向外伸直,整個身體呈T字型,一般的角色模型應該爲這個姿態。
T-Pose

Root Transform(根變換)

Root Transform是body transform在Y平面上的投影,並且是運行時計算的。每一幀Root Transform的變化實時計算。然後Transform的變化會被應用到GameObject上從而讓物體移動。

角色腳下的圓圈代表了Root Transform

調整Root Transform

通過對Animation Clip的設置來控制Body Transform投影到Root Transform的結果。

可以調整的有Root Transform Rotation, Root Transform Position (Y) 和 Root Transform Position (XZ) 。基於設置,Body Transform的部分數值可以轉移到Root Transform中。例如你可以選擇動畫中的Y曲線是Root Motion的一部分,還是Body Transform(pose)的一部分。

Root Transform Rotation

用於設置Root Transform的朝向(旋轉)。

Bake into Pose:選中後,角色的朝向會基於body transform(Pose)。Root Orientation會是一個常量,意味着Animation Clip不會旋轉這個物體。

只有AnimationClip的開始和結束位置旋轉相似的時候,才應該使用這個選項。可以通過右邊的綠燈判斷。通常用於向前直行的走或跑的動畫。

Base Upon:可以設置動畫的朝向基於的地方。

  • Body Orientation:動畫會朝向身體正前方。這個設置適用於大多數身體朝前的動畫,比如走跑跳。但是如果動畫是向左或向右平移的話,會有問題。這時候可以使用下面的Offset來調節角色的朝向。
  • Original:有的動畫師會給動畫手動加上旋轉,確保動畫的朝向正確,這時候可以使用這個選項,一般就不用再手動調整Offset了。

Offset:基於Base Upon的設置,調整偏移量。

Root Transform Position (Y)

用於設置Root Transform位置的Y軸位置。

Bake into Pose:選中後,動畫的Y軸的運動會保留在Body Transform(Pose)上。Root Transform的Y軸會是一個常數(不會受動畫影響變化),也就是意味着動畫不會改變物體位置的Y值。右邊有一個綠燈指示動畫起始位置和結束位置的高度是否一致,可以看出動畫是否適合使用此選項。

大多數的動畫應該選中此選項,除了那些會改變物體高度的動畫比如跳起、跳下這些動畫。

注意:Animator.gravityWeight是由Bake Into Pose position Y控制的。選中時gravityWeight = 1,不選中時gravityWeight = 0。gravityWeight用來在state轉換時進行混合。

Base Upon:和Root Transform Rotation設置類似,除了Original 或 Mass Center (Body)選項外,還有一個Feet選項。Feet選項非常適合改變物體高度的動畫(不勾選Bake Into Pose)。使用Feet時,Root Transform Position Y會匹配骨骼中腳部的Y位置(更低的那個)。Feet選項可以避免混合或轉換時浮空的現象。

Offset:可以設置高度的偏移量。

Root Transform Position (XZ)

用於設置Root Transform位置的XZ軸位置。

Bake Into Pose:通常用於原地不動的動畫(動畫在XZ軸上的位置爲0)。可以用來去除動畫循環累計的誤差,造成位置的移動。也可以通過設置Based Upon Original來強制使用動畫師設置的位置,否則會使用角色的重心作爲Root。

Loop Pose

Loop Pose(比如混合樹或Transition中的混合)會基於Root Transform。Root Transform在每幀被計算出來後,動畫的位置會相對Root Transform。開始幀和結束幀的差別會被計算出來,然後分佈到動畫的0-100%。完全沒看明白,得問大智了

Generic Root Motion

Generic和Humanoid基本是類似的,但是Generic的動畫的Root Transform是手動設置的Root Node屬性。


“大智,我看完Root Motion的文檔了,不過還是有點雲裏來霧裏去的,你能不能用簡單的幾句話說說設置Root Transform的作用是什麼?”

“簡單來說,**如果不設置Root Transform中的Bake Into Pose,動畫中的曲線會影響物體的Root Transform,而勾選了Bake Into Pose以後,動畫的曲線就不會影響物體的Root Transform。再直白點說,比如勾選了Root Transform Position (Y)的Bake Into Pose,那動畫就不會影響物體的Y軸位置了。**對於你遇到的剛體不會掉落的問題,也能解決了。”

“emmm,大概能明白,我還是得去試一試看看不同的效果。第二個問題:什麼是重定向?”

“重定向就是把A角色做的動畫用到B角色上。如果A和B兩個角色的骨骼結構完全一樣,那動畫可以直接重用。但是如果A和B的骨骼結構不一樣,但是是Humanoid類型的,可以使用Unity中的Retargeting系統,這個文檔裏也有,建議你先去看看。”

“哦,我現在貌似還用不到,等我用到的時候去查一下。最後一個問題哈,Loop Pose的作用是什麼?我看了半天也沒看明白是什麼意思”

“看不明白很正常,文檔中那個解釋確實有些不太直觀。這個作用是,如果一個循環動畫的首尾幀有差別,選中這個選項Unity會給你插值,讓首尾幀看起來是連貫的,循環起來沒有縫隙,但是可能會看起來有些奇怪。不過我們使用的動畫,一般動畫師都會做成無縫循環的動畫,所以這個選項也不經常使用。

“這麼一說我就能明白很多了,看來文檔也有不靠譜的時候啊”

總結

“文檔有時確實有描述不太準確或者晦澀的時候,這時候就需要你多動手。你看這個知道的‘知’字,左邊是矢,也就是箭矢,右邊是口,靶子也就是目標。這個字是說:不斷地練習,命中目標纔是知。所以要多實踐。”

“哇,智哥你當個程序員虧了,應該去研究哲學去。”

今日思考題

“我也有此意,哈哈。給你佈置個思考題,試下動畫加上不同的Root Motion設置以後會有什麼不同的效果。”

“收到!我去也!”

“收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。”

擴展閱讀

【擴展學習】洪流學堂公衆號回覆動畫可以閱讀本系列所有文章,更有視頻教程等着你!


呼~ 今天小新絮絮叨叨的真是夠夠的了。沒講清楚的地方歡迎評論,咱們一起探索。

我是大智(微信:zhz11235),你的技術探路者,下次見!

別走!點贊收藏哦!

好,你可以走了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章