Unity---动画系统学习(4)---使用混合树(Blend Tree)来实现走、跑、转弯等的动画切换

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:适用于动画不表示不同的方向

新建两个参数:SpeedZSpeedRotate,一个控制直线移动,一个控制转弯。
添加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

posted @ 2019-04-27 10:05  Fflyqaq  阅读(4039)  评论(1编辑  收藏