參考
Unity動畫系統(tǒng)詳解5:BlendTree混合樹是什么?
在游戲動畫中一個常見的任務(wù)是將兩個或多個相似的動作混合在一起。也許最著名的例子就是根據(jù)角色的速度混合行走和跑步的動畫。另一個例子是一個角色在跑步時向左或向右傾斜,就是根據(jù)參數(shù)來混合,決定當(dāng)前播放的是哪個動畫。
“混合樹和Transition中的混合不同,Transition中的混合只是在兩個State轉(zhuǎn)換時,在給定的時間內(nèi)進(jìn)行混合,避免動畫切換過于突兀。而混合樹中的混合,是時時刻刻進(jìn)行不同程度的混合。比如你的角色有站立、走、跑三個動作,走路的速度是2m/s,跑的速度是5m/s,那你想讓角色的速度是3m/s,這時候怎么辦?這時候用混合樹就能很簡單地解決?!?/p>

雙擊這個節(jié)點,進(jìn)入BlendTree內(nèi)部圖。選中后,看一下屬性

一、1D混合

1.Parameter
這里參數(shù)只能選Parameters中的float類型。
2.Add Motion
可以點擊小加號按鈕,或者在Blend Tree節(jié)點上右鍵Add Motion。點擊后會在Motion列表中添加一個條目,可以將Animation Clip拖進(jìn)來。

3.Threshold

最上面的圖顯示了參數(shù)對每個動畫的影響。每個動畫顯示為一個藍(lán)色的三角形。如果點擊這個三角形,會在下面的動畫列表中高亮一下。每個三角形的頂角位置定義了參數(shù)在該位置時,會完全使用這個動畫,這個值也叫做該動畫的閾值(Threshold)。比如上圖中的walking動畫,閾值是1,在混合圖的中心位置。
圖中的紅線代表了參數(shù)的數(shù)值,主要是用來預(yù)覽調(diào)試。可以拖動紅線,在下面預(yù)覽窗口觀察動畫式如何混合的。

4.參數(shù)范圍

上圖中,左右兩個數(shù)字代表了參數(shù)的范圍。點擊數(shù)字可以變成輸入框修改,也可以在數(shù)字上拖拽調(diào)節(jié)。修改時會影響到第一個動畫和最后一個動畫的閾值。
5.Automate Threshold
修改動畫對應(yīng)的閾值可以直接拖拽對應(yīng)的藍(lán)色三角形。如果沒有勾選Automate Threshold(自動計算閾值),也可以在閾值編輯框中直接輸入數(shù)值。選中Automate Threshold(自動計算閾值)時,閾值會自動在最小值和最大值之間自動平均分布。
6.Compute Thresholds
下面有一個Compute Thresholds下拉框,使用這個下拉框,可以根據(jù)動畫中的數(shù)據(jù),自動計算閾值。數(shù)據(jù)包括:speed(速度),velocity x、y、z(xyz三個軸分別的速度),angular speed(轉(zhuǎn)動速度,單位是角度或弧度)。
這些數(shù)據(jù)如何知道呢?
比如:走路動畫的速度是1.5m/s,跑的速度是4m/s,如果選擇Compute Thresholds中的Speed,walk動畫的閾值會被設(shè)置為1.5,run動畫的閾值會被設(shè)置為4。
7.Time Scale

通過動畫速度這一列(圖標(biāo)是一個表)可以調(diào)節(jié)動畫的播放速度,比如你想讓跑步的動畫播放速度變?yōu)樵瓉淼?倍,可以設(shè)置為2。

Adjust Time Scale > Homogeneous Speed 可以將動畫的速度調(diào)整對應(yīng)到參數(shù)的最小值和最大值,但是保持動畫的初始相對速度。
這句話看得我欲生欲死,得問問大智是什么意思
按鈕可以將動畫的播放速度調(diào)整到動畫列表中所有動畫速度的平均值。
8.Mirroring 鏡像

上面復(fù)選框可以左右鏡像一個humanoid類型的動畫Clip。這個功能可以使用同一個動畫創(chuàng)建出來兩個方向的動畫,可以節(jié)省一倍的存儲空間和內(nèi)存。
比如一個向左走的動畫,通過鏡像可以創(chuàng)建出一個向右走的動畫。
9.難點解析一 自動計算Threshold的時候,那些動畫的速度啊,旋轉(zhuǎn)速度怎么知道???”
“選中一個Animation Clip,你可以看到這些數(shù)據(jù),比如這個:”

“第一行是這個動畫在xyz軸上的速度,第二行是旋轉(zhuǎn)速度?!?/p>
注意這里必須是Humanoid類型的動畫才有
10.難點解析二 Adjust Time Scale > Homogeneous Speed
我記得文檔中的解釋有一些難理解,其實這個按鈕的作用就是:先將所有動畫的平均速度算出來,然后通過調(diào)節(jié)動畫的speed讓所有動畫的速度都一致。
11.其它案例
可以參考《學(xué)Unity的貓》——第十六集:Unity動畫使用混合樹BlendTree實現(xiàn)動畫過渡控制
二、2D混合樹
2D混合樹有三個選項,分別是:
- 2D Simple Directional(2D簡單方向):當(dāng)你的運動代表不同的方向,如“向前走”,“向后走”,“向左走”,“向右走”,或“向上瞄準(zhǔn)”,“向下瞄準(zhǔn)”,“左瞄“和”右瞄“。當(dāng)然了,可以在(0,0)處包含一個默認(rèn)動作類似“空閑站立”或“直線瞄準(zhǔn)”。與1D混合樹不同的是,2D Simple Directional不是在同一個方向上的多個動作,比如“走”和“跑”。
- 2D Freeform Directional(2D自由方向):動畫運用有不同的方向時,也可以使用這種混合類型:可以在同一個方向上有多個運動,例如“走”和“跑”。在Freeform Directional類型中,(0,0)位置必須包含一個默認(rèn)動作,如“空閑站立”。
- 2D Freeform Cartesian(2D自由笛卡兒):當(dāng)混合的2個參數(shù)不代表不同的方向時使用。使用Freeform Cartesian,參數(shù)X和Y可以表示不同的概念類型,例如角速度和線速度。舉個例子:“向前走不轉(zhuǎn)向”,“向前跑不轉(zhuǎn)向”,“向前走并右轉(zhuǎn)”,“向前跑并右轉(zhuǎn)”等動作。
如果角色動畫包含站立、走、跑和轉(zhuǎn)向,非常符合2D Freeform Cartesian這種類型。后面以2D Freeform Cartesian舉例說明。
image.png
1.設(shè)置參數(shù)
在Animator中添加兩個float參數(shù):Turn和Forward分別代表轉(zhuǎn)向速度和向前行進(jìn)速度,然后將這兩個值設(shè)置為混合樹的參數(shù)(注意順序)
2.Add Motion
然后點擊 + > Add Motion Field 添加下列動畫clip到混合樹動畫列表。(先不管后面的值)
下面,我們可以使用Unity中提供的自動計算Pos值的功能,來自動計算混合樹的閾值。
3.Positions詳解
每一個Motion都有一個自己的位置,當(dāng)參數(shù)(x,y)靠近這個位置時,這個動畫就會參與混合。離得越近,這個動畫的比重就越大。
選中一個Motion時,圖中的藍(lán)點會有選中的狀態(tài);同樣選中混合圖中一個藍(lán)點,對應(yīng)的Motion也會有選中的狀態(tài)。

可以拖動混合圖中相應(yīng)的藍(lán)點來修改位置,也可以直接修改Motion后面的值。
紅色的點是當(dāng)前參數(shù)的“位置”。如果在Inspector面板下方的預(yù)覽區(qū)域點擊Play,并在圖中拖動紅點的位置,可以看到不同參數(shù)位置的混合效果。在圖中還可以看到每個動作的混合因子,被繪制成圍繞動作的點的圓圈。當(dāng)把紅點拖到藍(lán)點上方時,該圓圈的半徑會達(dá)到最大,而其它動作的圓圈就沒有了。在動作之間的位置,會有多個動作參與混合。如果你選中一個動作的點,查看它的混合因子值域圖(藍(lán)色區(qū)域),你會發(fā)現(xiàn),紅點在約深顏色的位置,動作的圓圈半徑越大。
當(dāng)沒有動作點被選中時,混合圖會混合所有動作的值域圖,并且單個動作混合因子越大,顏色越深,影響的動作越多,顏色越淺。
4.Compute Positions
Unity提供了自動計算Position的功能。

通過Compute Position下拉菜單可以選擇不同的計算方式:
- 屬性功能Velocity XZ根據(jù)動畫自身的速度,將velocity.x設(shè)置每個動畫的Pos X,將velocity.z設(shè)置Pos Y。適合2D Simple Directional和2D Freeform Directional類型的混合樹。
- Speed And Angular Speed將動畫的Y軸角速度(弧度每秒)設(shè)置到Pos X,速度設(shè)置到Pos Y。適合2D Freeform Cartesian類型的混合樹。
- 另外,還可以通過 Compute Position -> X Position From 或 Compute 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°
可以根據(jù)項目的需要來選擇,兩種都可行,但是如果X,Y的數(shù)值相差過大的話,在混合圖上顯示會不便于調(diào)試。
在模型的Import Settings面板可以看到動畫的速度

5.預(yù)覽
這里我下載的動畫素材,沒弄出來。參考下原作者的吧:
參考上面的內(nèi)容,我們可以使用Speed And Angular Speed來計算每個Motion的位置。設(shè)置完后,整個混合樹如下圖所示:


也可以參考B站視頻:https://www.bilibili.com/video/BV1cx411y7mu

6.混合的原理
動畫混合時,會根據(jù)X和Y兩個值來確定混合的動畫以及各自所占的比重。上面動圖中我們可以看到,拖動紅點時,可以看到不同的節(jié)點上面圓圈在發(fā)生不同的變化,圓圈的大小即這個動畫所占比重的大小。

紅點所在的位置代表了X和Y兩個參數(shù)的值對應(yīng)的位置。橫軸是X,縱軸是Y。
7.難點解析
“大智,這個2D混合樹中的閾值和動畫中的真實速度是對應(yīng)關(guān)系么?”
“其實只要保持對應(yīng)的相對比例就可以,并不一定要真實的速度:”
- X,Y的值和動畫的實際速度沒有映射關(guān)系。我們也可以將“走”的動畫的Y值設(shè)置的大一些,將跑的動畫設(shè)置的小一些。但是這樣設(shè)置會在表現(xiàn)上不符合玩家的預(yù)期,感覺怪怪的。
- 在手動調(diào)整時,只要點之間的相對位置保持不變,混合效果不會受太大的影響。
- 但是要注意在寫代碼的時候,要根據(jù)調(diào)整過后值的范圍來設(shè)置對應(yīng)的參數(shù)。

三、Direct Blending 直接混合
直接混合可以直接將animator的參數(shù)映射到混合樹動畫的權(quán)重。這在什么時候使用呢?如果你想用參數(shù)精確控制混合的動畫,而不是通過以兩個參數(shù)間接控制動畫的混合。


設(shè)置一個direct混合樹時,motion列表中的每一個動畫需要對應(yīng)一個參數(shù),用來控制這個動畫的混合權(quán)重。
