• 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
    

  • 相关阅读:
    vmware克隆Centos6.4虚拟机网卡无法启动问题
    mysql错误:Statement violates GTID consistency
    /etc/vsftpd.conf详解
    Linux /etc/fstab文件
    sudo命令详解
    linux fack 文件系统修复命令
    ORA-01502: 索引或这类索引的分区处于不可用状态
    Oracle 完整性约束错误
    linux下部署redis
    Python 发送邮件案例
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/10777793.html
Copyright © 2020-2023  润新知