Unity動畫系統詳解7:Layer是什麼?

摘要:使用Layer可以用來管理角色的不同身體部位。比如下半身用於行走或跑步,上半身用於射擊或投擲物體。

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

“大智,我的Animator狀態機裏面的狀態很多,現在太難管理了。我有很多姿勢,比如不拿槍,拿手槍,拿衝鋒槍,拿步槍,每種姿勢都要做一個混合樹,現在再去加蹲的狀態,簡直爆炸,有沒有什麼好辦法?”

“我看看你的Animator Controller現在是什麼樣子?”

“還是挺整潔的嘛,感覺並沒有很複雜呀”
“這只是表面現象,每個混合樹裏都有好多狀態呀”

“那你想想這些動畫之間有沒有什麼相似的地方可以提取出來的?”
“要說相似的話,它們腿部的動畫是類似的,不管拿槍姿勢如何,腿部都是一樣的,只有胳膊的動畫不太一樣。”

“嗯,這你就算說到點子上了!這時候可以用下Animator Controller中的Layer的相關文檔,你先去看看?”
“就是Parameters邊上那個Layer麼?看到它好久了還一直不知道有什麼用呢!我先去了解了解!”

下面是小新的筆記本中的內容:

Animation Layers

使用Layer可以用來管理角色的不同身體部位。比如下半身用於行走或跑步,上半身用於射擊或投擲物體。

可以從Animator左上角的Layer標籤中管理Layer。

點擊加號可以添加一個Layer。點擊Layer旁邊的齒輪圖標,會彈出一個小窗口,可以設置該Layer對應的參數。

Weight 這一層的權重,0代表該層權重是0(該層不生效),1代表該層權重爲1(該層中的動畫能完全表現)

Mask 設置該Layer能控制身體的哪部分,設置後該Layer上面會顯示一個M的小圖標。詳細筆記見下方

Blending 和其他層混合的模式。

  • Override 覆蓋上面的層中對應Mask的部位
  • Additive 會加在之前Layer的動畫之上

Sync 複用其他層中的狀態機。詳細筆記見下方

IK Pass 什麼是IK?得問問大智

Avatar Mask

用來設置該Layer的動畫會影響角色的哪一部分的遮罩。

創建Avatar Mask

在Project窗口中右鍵,Create > Avatar Mask點擊後會創建一個AvatarMask文件,此時可以對文件命名。

編輯AvatarMask

AvatarMask有兩種定義身體遮罩的方式:

  • 通過Humanoid身體映射圖
  • 通過Transform層次結構選擇包含或不包含的骨骼

Humanoid

如果你的動畫是人形動畫,建議用這一種方式可以快速設置AvatarMask。

身體映射圖包含以下幾部分:

  • 頭部
  • 左臂
  • 右臂
  • 左手
  • 右手
  • 左腿
  • 右腿
  • Root(腳下的圓形陰影部分)

可以通過鼠標點擊每一部分,綠色代表動畫可以影響這一部分,紅色代表動畫不會影響。在空白處點擊可以全選/全不選。

手部和腳部的IK可以開關,表示該部分的IK曲線是否參與動畫混合。IK又出現了,一會去問問大智

Transform

如果動畫沒有使用Humanoid,或者你想更精細的控制遮罩,你可以通過Transform層級結構來控制每一個骨骼。

1、選擇一個Avatar(動畫模型的Avatar)
2、點擊Import Skeleton按鈕。avatar的層級結構會顯示出來。
3、可以設置對應的骨骼是否受動畫控制

其他用途

在模型導入設置的Animation頁籤中,也可以設置Mask,設置後只會導入對應Mask的動畫數據。

在這設置Mask的好處是:可以減少內存佔用和CPU佔用。因爲不需要的身體部位的動畫曲線不會被加載,並且不會參與計算。

實例

比如你想人物保持行走、跑步、站立的同時上身能夠投擲東西,你可以按下圖設置Layer:

Sync

有時能夠在不同的Layer重用其他Layer的狀態機非常有用。比如你想模擬一個“受傷”的狀態,你有受傷狀態的各種動畫比如走跑跳。這時候你可以選中Sync複選框,選擇你想要同步的Layer。狀態機的結構會保持一致,但是可以設置不同的Animation Clip。選中時,Layer旁邊會有一個S小圖標。

這意味着,同步出來的Layer不需要再去定義狀態機,並且源Layer中狀態機的任何變化都會同步到這一同步Layer。唯一需要你做的就是設置每個State中使用的動畫。

Sync複選框旁邊還有一個Timing複選框。

  • 不選中時,Sync出來的Layer中每一個State的動畫長度會變爲源Layer中的時長。
  • 選中時,根據Weight調整動畫時長,Weight爲1時使用Sync Layer中的動畫時長。

“大智,我看完了,這個東西還是很強大的呀,正好符合我的需要。不過這裏面有好多地方提到了IK,這個IK是什麼東西呢?”
“IK是Inverse Kinematics的縮寫,也就是反向動力學。”

“那是不是還有正向動力學?”
“沒錯,你都會舉一反三了!大多數動畫是通過旋轉骨骼來實現的。子骨骼的位置跟着父骨骼的旋轉而改變,因此關節鏈的終點可以根據前面的各個骨骼的角度和相對位置確定。這種構成骨骼動畫的方法稱爲正向動力學。

“那反向動力學是不是就是根據骨骼的最終節點,反向推算之前的骨骼節點的位置?”
“喲,不錯哦,有長進。正如你所說的一樣。有些時候我們需要根據空間中的位置來確定骨骼節點的位置,比如讓角色拿槍,不同的槍可能握持的位置不太相同,就需要根據握持的位置來決定角色手的位置。Unity中的IK支持所有人形動畫。”

“這樣說我就有些明白了,Animator中的State設置中的Foot IK是不是就是設置腳部受IK的影響?”
“是的。”
“那Layer中的IK Pass是什麼意思呢?”
“選中IK Pass的時候,每幀會調用腳本中的OnAnimatorIK方法,可以在這個方法中動態設置IK,這個明天給你細講一下。”
“好~”

總結

小新:“有了Layer,我感覺我的動畫可以分爲上半身和下半身兩個Layer,這樣一來就不需要對每個拿槍的動作設置移動的混合樹了,應該能簡化不少工作。”
“確實是這樣,合理利用Layer不僅可以減少動畫師的動畫製作工作量,還能在性能上對遊戲進行優化。”

今日思考題

小新:“那我現在就去就用Layer改造下我的狀態機”
“今天真自覺,哈哈,我本來也想給你佈置這個小作業呢!”
“我去也!”
大智:“收穫別忘了分享出來!別忘了點擊右下角請好友看免費分享給你的朋友,也許能夠幫到他。”

擴展閱讀

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


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

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

別走!點贊收藏哦!

好,你可以走了。

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