• 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
    

  • 相关阅读:
    一元运算符重载 前置和后置++ --(这种一般用成员函数来实现重载)
    运算符中的二元重载,为什么要调用友元函数而不是全局函数的问题
    关于数组的封装不知道为什么错了,具体代码如下
    关于对象的动态建立和释放
    关于构造函数中调用构造函数的危险
    关于析构函数,构造函数匿名对象的总结,以厚忘了,可以回来观看很全
    关于深拷贝和浅拷贝的疑问
    构造函数的调用大全
    构造函数的调用(其中不包括赋值构造函数)
    LeetCode:Add Digits
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/10777793.html
Copyright © 2020-2023  润新知