1. 介紹
Blend Tree用於多個動畫之間的混合,比如走到跑的切換、轉彎的切換。
如果用動畫學習筆記(3)中的方法,需要新建很多的狀態,不僅麻煩,而且切換狀態時也很容易不流暢。
而Blend Tree就很好的解決了這個問題
2. 1D Blend Tree 的使用
右鍵新建一個Blend Tree,雙擊

在右側添加三個Motion,Idle、Walk、Run(使用動畫學習筆記2中的資源)

Parameter:設置動畫根據哪個參數進行融合
Automate Thresholds:是否自動選擇參數
選擇參數Parameter為Speed,取消勾選Automate Thresholds。
在動畫學習筆記(3)中,我們就是使用Speed來控制Walk動畫的播放,當按下W時,Speed的值插值增加到1,當按下Shift時,從Walk動畫切換到Run動畫。
在這里我們同樣使用Speed,不同於3的是把Walk和Run融合到一起,按下W會先從Idle切換到Walk,再變為Run,這樣就會顯得比較自然流暢。
在Compute Thresholds中選擇Speed,會根據動畫的偏差給走和跑賦一個值(也可以自己微調)。
注意這里Speed的值范圍是從0~4.1
private int speedID = Animator.StringToHash("Speed");
private float speedMax = 4.1f
private Animator anim;
void Start()
{
anim = gameObject.GetComponent<Animator>();
}
void Update()
{
anim.SetFloat(speedID, Input.GetAxis("Vertical")*speedMax);
}

可以發現三個動作的切換非常的流暢
3. 2D Blend Tree的使用
2D Simple Directional:適用於動畫都有不同的方向。
2D Freeform Directional:和第一個區別是可以有動畫在一個方向上。要保證一個在原點(0,0)的動畫,比如idle
2D Freeform Cartesian:適用於動畫不表示不同的方向
新建兩個參數:SpeedZ和SpeedRotate,一個控制直線移動,一個控制轉彎。
添加5個動畫

我們使用2D Freeform Directional
設置X Position From---Augular Speed(Deg角度)
設置Y Position From---VelocityZ(Z軸速度)

系統會根據偏移自動設置好,我們只需要使用這個值就可以了。
代碼
private int speedZID = Animator.StringToHash("SpeedZ");
private int speedRotateID = Animator.StringToHash("SpeedRotate");
private float speedMax = 4.1f;
private float speedRotateMax = 126.1f;
private float dampTime = 0.2f;
private Animator anim;
void Start()
{
anim = gameObject.GetComponent<Animator>();
}
void Update()
{
anim.SetFloat(speedZID, Input.GetAxis("Vertical")*speedMax);
anim.SetFloat(speedRotateID, Input.GetAxis("Horizontal")*speedRotateMax,dampTime,Time.deltaTime);
}
//SetFloat的另一種重載方式
//第3個參數表示完成變化所需要的時間,可以給一個比較小的值,相當於自帶了一個插值運算Lerp,是動畫更加平滑
//第4個參數表示執行該方法的時間間隔,我們的動畫是每幀都在運動,所以設置為Time.deltaTime

