Unity 動畫系列六 BlendTree混合樹

參考
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>

image.png

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


image.png
一、1D混合
image.png
1.Parameter

這里參數(shù)只能選Parameters中的float類型。

2.Add Motion

可以點擊小加號按鈕,或者在Blend Tree節(jié)點上右鍵Add Motion。點擊后會在Motion列表中添加一個條目,可以將Animation Clip拖進(jìn)來。


image.png
3.Threshold
image.png

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

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


image.png
4.參數(shù)范圍
image.png

上圖中,左右兩個數(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
image.png

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

image.png

Adjust Time Scale > Homogeneous Speed 可以將動畫的速度調(diào)整對應(yīng)到參數(shù)的最小值和最大值,但是保持動畫的初始相對速度。

這句話看得我欲生欲死,得問問大智是什么意思
按鈕可以將動畫的播放速度調(diào)整到動畫列表中所有動畫速度的平均值。

8.Mirroring 鏡像
image.png

上面復(fù)選框可以左右鏡像一個humanoid類型的動畫Clip。這個功能可以使用同一個動畫創(chuàng)建出來兩個方向的動畫,可以節(jié)省一倍的存儲空間和內(nèi)存。

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

9.難點解析一 自動計算Threshold的時候,那些動畫的速度啊,旋轉(zhuǎn)速度怎么知道???”

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


image.png

“第一行是這個動畫在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)。


image.png

可以拖動混合圖中相應(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的功能。


image.png

通過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面板可以看到動畫的速度


image.png
5.預(yù)覽

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


image.png

cb6ab060-2362-11eb-a200-8e279300b67d 00_00_00-00_00_30.gif

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

如圖,通過4方位的動畫,就能融合出任意方向

6.混合的原理

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


image.png

紅點所在的位置代表了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ù)。
image.png
三、Direct Blending 直接混合

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


image.png
image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容