zoukankan      html  css  js  c++  java
  • 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
    

  • 相关阅读:
    普通百姓如何应对通货膨胀
    经济
    将到来的战略转变:移动 Web 还是移动 Apps?
    ASP.Net 第一天笔记 MVC 控制器与视图数据传递注意事项
    关于阿里云 ETC服务器 端口开放问题
    .net 委托 +lamda表达式
    de4Dot用法 解决 .net程序 reflecter反编译 “索引超出了数组界限”问题
    fastReport.net 初了解
    关于JQuery Ajax 跨域 访问.net WebService
    JQuery AJAX 通过一般处理程序 取列表
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/10777793.html
Copyright © 2011-2022 走看看