Unity動畫系統詳解5:BlendTree混合樹是什麼?

摘要:“Animator中有一個功能,用來解決多個動畫之間的混合,經常用於移動動畫之間的混合,這個功能叫做BlendTree,混合樹。

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

“智哥,我用Animator做了一個人物移動的狀態機,怎麼看怎麼不順眼,這也太複雜了,你來看看?”

小新做的人物移動的狀態機

“喲,這不是挺規整的嘛,我看起來挺順眼的,哈哈哈”

“去去去,我這光一個走路的就得搞這麼複雜,而且還沒法斜着跑,我這做一個動畫,這得多少個狀態啊”

“emmm,我這有一個秒招,不知道你想學不想學?”

“那當然想學了,看我每天學習的熱情多麼高漲”

“那你先帶我去把晚飯解決了”

“哎呀,咱們點個外賣,我已經等不及了,喫飯這都不重要”

“那也成,給我來個10斤的龍蝦,點好了再來找我”

小新花了30秒搞定外賣,“快快快,開始上課!”

“看你小子猴急的,以後能成大器,嘿嘿”

BlendTree 混合樹

“Animator中有一個功能,用來解決多個動畫之間的混合,經常用於移動動畫之間的混合,這個功能叫做BlendTree,混合樹。

“混合樹和Transition中的混合有啥區別呢?”

“混合樹和Transition中的混合不同,**Transition中的混合只是在兩個State轉換時,在給定的時間內進行混合,避免動畫切換過於突兀。而混合樹中的混合,是時時刻刻進行不同程度的混合。**比如你的角色有站立、走、跑三個動作,走路的速度是2m/s,跑的速度是5m/s,那你想讓角色的速度是3m/s,這時候怎麼辦?這時候用混合樹就能很簡單地解決。”

“聽起來很厲害,那你用我的這個移動的例子給我講講怎麼搞唄?”

“不要着急,這時候你應該先去看看混合樹的文檔,自己試試,看看會遇到什麼問題”

“好,那我先去看看文檔”

“嗯,對了,我的大龍蝦呢?”

“嘿嘿,大龍蝦沒有,不過給你點了個龍蝦飯,看我夠意思吧”

“哎,湊活吧,以後再讓我教你可就難啦”

小新回到自己的房間,開始學習混合樹的文檔,並且記了筆記。

創建混合樹

在Animator窗口的空白處右鍵,Create State > From New Blend Tree,雙擊這個節點可以進入混合樹圖。

混合樹有3種類型,在右邊的Blend Type中可以設置。分別爲:

  • 1D
  • 2D
  • Direct

1D混合

1D混合是根據一個參數進行動畫混合。

1、首先要設置用於混合的參數,也就是從Animator的Parameters中的選擇一個參數。

2、添加動畫:可以點擊小加號按鈕,或者在Blend Tree節點上右鍵Add Motion。點擊後會在Motion列表中添加一個條目,可以將Animation Clip拖進來。

添加完動畫,整個混合的樣子:

最上面的圖顯示了參數對每個動畫的影響。每個動畫顯示爲一個藍色的三角形。如果點擊這個三角形,會在下面的動畫列表中高亮一下。**每個三角形的頂角位置定義了參數在該位置時,會完全使用這個動畫,這個值也叫做該動畫的閾值(Threshold)。**比如上圖中的run動畫,閾值是0.5,在混合圖的中心位置。

圖中的紅線代表了參數的數值,主要是用來預覽調試。可以拖動紅線,在下面預覽窗口觀察動畫式如何混合的。

注意點播放按鈕,可以預覽動畫播放的狀態

參數範圍

上圖中,左右兩個數字代表了參數的範圍。點擊數字可以變成輸入框修改,也可以在數字上拖拽調節。修改時會影響到第一個動畫和最後一個動畫的閾值。

Threshold 閾值

修改動畫對應的閾值可以直接拖拽對應的藍色三角形。如果沒有勾選Automate Threshold(自動計算閾值),也可以在閾值編輯框中直接輸入數值。選中Automate Threshold(自動計算閾值)時,閾值會自動在最小值和最大值之間自動平均分佈。

下面有一個Compute Thresholds下拉框,使用這個下拉框,可以根據動畫中的數據,自動計算閾值。數據包括:speed(速度),velocity x、y、z(xyz三個軸分別的速度),angular speed(轉動速度,單位是角度或弧度)。這些數據如何知道呢?

比如:走路動畫的速度是1.5m/s,跑的速度是4m/s,如果選擇Compute Thresholds中的Speed,walk動畫的閾值會被設置爲1.5,run動畫的閾值會被設置爲4。

Time Scale

通過動畫速度這一列(圖標是一個表)可以調節動畫的播放速度,比如你想讓跑步的動畫播放速度變爲原來的2倍,可以設置爲2。

**Adjust Time Scale > Homogeneous Speed ** 可以將動畫的速度調整對應到參數的最小值和最大值,但是保持動畫的初始相對速度。
這句話看得我欲生欲死,得問問大智是什麼意思

按鈕可以將動畫的播放速度調整到動畫列表中所有動畫速度的平均值。

Mirroring 鏡像

上面複選框可以左右鏡像一個humanoid類型的動畫Clip。這個功能可以使用同一個動畫創建出來兩個方向的動畫,可以節省一倍的存儲空間和內存。

比如一個向左走的動畫,通過鏡像可以創建出一個向右走的動畫。

難點解析

這時候門鈴響了,“先生,您的龍蝦飯到了。祝您用餐愉快,給個5星好評唄~”

“大智,喫飯前問你兩個問題唄”

“不行,我得看看這個龍蝦飯到底怎麼樣”

說着大智以迅雷不及掩耳之速拆開了包裝,吃了幾口。

“嗯,還不錯,心情大好,來問吧!”

“我選的,能不好喫嘛!”

“第一個問題:自動計算Threshold的時候,那些動畫的速度啊,旋轉速度怎麼知道啊?”

“選中一個Animation Clip,你可以看到這些數據,比如這個:”

“第一行是這個動畫在xyz軸上的速度,第二行是旋轉速度。”

“原來在這,這裏我還沒仔細看過呢”

“以後會用到的”

“第二個問題:**Adjust Time Scale > Homogeneous Speed **這個到底是幹嘛的,怎麼我看了半天都沒看明白文檔中的含義?”

“我記得文檔中的解釋有一些難理解,其實這個按鈕的作用就是:先將所有動畫的平均速度算出來,然後通過調節動畫的speed讓所有動畫的速度都一致。

“啊?真的麼?我怎麼看文檔跟這個一點聯繫都沒有呢?”

“不信你去試試,看看是不是我說的這樣”

“OK,你趕緊喫飯吧,我要繼續去看了,2D混合樹還沒看呢”

小新回到房間繼續學習2D混合樹,下面是他做的學習筆記。

2D混合樹

2D混合樹可以根據2個參數進行動畫混合。

最終效果展示

2D混合樹有三個選項,分別是:

  • 2D Simple Directional(2D簡單方向):當你的運動代表不同的方向,如“向前走”,“向後走”,“向左走”,“向右走”,或“向上瞄準”,“向下瞄準”,“左瞄“和”右瞄“。當然了,可以在(0,0)處包含一個默認動作類似“空閒站立”或“直線瞄準”。與1D混合樹不同的是,2D Simple Directional不是在同一個方向上的多個動作,比如“走”和“跑”。

  • 2D Freeform Directional(2D自由方向):動畫運用有不同的方向時,也可以使用這種混合類型:可以在同一個方向上有多個運動,例如“走”和“跑”。在Freeform Directional類型中,(0,0)位置必須包含一個默認動作,如“空閒站立”。

  • 2D Freeform Cartesian(2D自由笛卡兒):當混合的2個參數代表不同的方向時使用。使用Freeform Cartesian,參數X和Y可以表示不同的概念類型,例如角速度和線速度。舉個例子:“向前走不轉向”,“向前跑不轉向”,“向前走並右轉”,“向前跑並右轉”等動作。

如果角色動畫包含站立、走、跑和轉向,非常符合2D Freeform Cartesian這種類型。後面以2D Freeform Cartesian舉例說明。

將Blend Type設置爲2D Freeform Cartesian

設置Blend Type之後,首先需要兩個參數控制這個Blend Tree。

在Animator中添加兩個float參數:Turn和Forward分別代表轉向速度和向前行進速度,然後將這兩個值設置爲混合樹的參數(注意順序)

注意參數的順序

然後點擊 + > Add Motion Field 添加下列動畫clip到混合樹動畫列表。(先不管後面的值)

下面,我們可以使用Unity中提供的自動計算Pos值的功能,來自動計算混合樹的閾值。

Positions詳解

每一個Motion都有一個自己的位置,當參數(x,y)靠近這個位置時,這個動畫就會參與混合。離得越近,這個動畫的比重就越大。

選中一個Motion時,圖中的藍點會有選中的狀態;同樣選中混合圖中一個藍點,對應的Motion也會有選中的狀態。

Motion選中狀態

可以拖動混合圖中相應的藍點來修改位置,也可以直接修改Motion後面的值。

Compute Positions

Unity提供了自動計算Position的功能。

通過Compute Position下拉菜單可以選擇不同的計算方式:

屬性 功能
Velocity XZ 根據動畫自身的速度,將velocity.x設置每個動畫的Pos X,將velocity.z設置Pos Y。適合2D Simple Directional和2D Freeform Directional類型的混合樹。
Speed And Angular Speed 將動畫的Y軸角速度(弧度每秒)設置到Pos X,速度設置到Pos Y。適合2D Freeform Cartesian類型的混合樹。

另外,還可以通過 Compute Position -> X Position FromCompute Position -> Y Position From 單獨計算X或Y的值。

屬性 功能
Speed 動畫的速度
Velocity X 沿X軸的速度
Velocity Y 沿Y軸的速度
Velocity Z 沿Z軸的速度
Angular Speed (Rad) Y軸的角速度,單位是弧度/秒
Angular Speed (Deg) Y軸的角速度,單位是角度/秒

Rad 和 Deg 分別代表了弧度和角度,弧度π(3.1415…) = 180°
可以根據項目的需要來選擇,兩種都可行,但是如果X,Y的數值相差過大的話,在混合圖上顯示會不便於調試。

在模型的Import Settings面板可以看到動畫的速度

查看動畫的速度和角速度

回到我們的混合樹:
參考上面的內容,我們可以使用Speed And Angular Speed來計算每個Motion的位置。

選擇Compute Positions中的Speed And Angular Speed

設置完後,整個混合樹如下圖所示:

現在我們來測試一下,看看怎麼樣。

設置完畢後的效果

Preview窗口中,記得一定要點擊左上角的播放,動畫纔會實時播放看到效果。

混合的原理

動畫混合時,會根據X和Y兩個值來確定混合的動畫以及各自所佔的比重。上面動圖中我們可以看到,拖動紅點時,可以看到不同的節點上面圓圈在發生不同的變化,圓圈的大小即這個動畫所佔比重的大小。

6個動畫混合的效果
紅點所在的位置代表了X和Y兩個參數的值對應的位置。橫軸是X,縱軸是Y。

Direct Blending 直接混合

直接混合可以直接將animator的參數映射到混合樹動畫的權重。這在什麼時候使用呢?如果你想用參數精確控制混合的動畫,而不是通過以兩個參數間接控制動畫的混合。

設置一個direct混合樹時,motion列表中的每一個動畫需要對應一個參數,用來控制這個動畫的混合權重。

難點解析

“大智,這個2D混合樹中的閾值和動畫中的真實速度是對應關係麼?”

“其實只要保持對應的相對比例就可以,並不一定要真實的速度:”

1、X,Y的值和動畫的實際速度沒有映射關係。我們也可以將“走”的動畫的Y值設置的大一些,將跑的動畫設置的小一些。但是這樣設置會在表現上不符合玩家的預期,感覺怪怪的。

2、在手動調整時,只要點之間的相對位置保持不變,混合效果不會受太大的影響。

3、但是要注意在寫代碼的時候,要根據調整過後值的範圍來設置對應的參數。

“這樣調整完參數就感覺整個圖好看了好多,哈哈!”

總結

“現在你知道混合樹是幹嘛的了吧?”
“知道了,混合樹可以根據參數,混合多個動畫,每個動畫有不同的權重,這樣就有了很多中間狀態。”
“想要把混合樹用好,需要多去嘗試一下”
“嗯,我這就準備把我那個移動的Animator Controller改成混合樹的方式呢”

今日思考題

“正好,給你佈置個思考題,實現人物的前後左右走、跑的動態混合,正好也能用到你的喫雞遊戲裏”
“收到!我去也!”
“收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。”

擴展閱讀

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


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

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

別走!點贊收藏哦!

好,你可以走了。

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