美文网首页
Unity 2D:混合动画树Blend Tree

Unity 2D:混合动画树Blend Tree

作者: 有怪兽变身奥特曼 | 来源:发表于2021-12-30 21:27 被阅读0次
    Blend Tree

    在之前的移动脚本中,虽然成功完成了移动,但是所有移动都没有动画效果,正常的游戏中,我们向左或向右移动应该会有相应的动画效果,因此我们用Blend Tree实现。

    角色移动脚本:传送门

    1.创建一个玩家空闲状态

    玩家没有任何操作的时候,应当有一个空闲动画状态,因此我们可以使用之前的动画创建方式创建一个Idle的空闲状态:

    动画创建:传送门
    动画的状态设置在Animator视图中,双击精灵相应的Animator Controller文件即可自动打开视图:

    Animator视图

    2.将空闲状态设置成我们玩家的默认状态

    选中我们创建的空闲动画,右键选中Set as Layer Default State,将我们的Idle设置成默认动画,这样玩家在不行动的情况下就会播放这个动画:

    Set as Layer Default State

    变成默认动画状态成功后,动画的颜色会变成橙色:


    默认的状态

    3.创建Blend Tree

    在我们Animator视图的空白处右键,Create State -> From New Blend Tree创建一个Blend Tree:

    创建Blend Tree
    双击我们的Blend Tree,会打开一个新的视图,可以编辑我们的Blend Tree:
    Blend Tree视图

    4.创建动画参数

    动画参数相当于一个开关,可以使用这些参数让动画应该展示什么,如果使用编程语言来描述,就类似于if判断,因此我们在执行动画的时候只要设置相应参数的值,即可播放相应的动画:

    查看我们Animator左上角的Parameters标签,打开后点击+号可以创建各种类型的参数:

    动画参数选择

    Float:浮点类型,该参数是带有小数点的数值,如1.2、3.4;
    Int:整数类型,如1、3、4;
    Bool:布尔类型,如true、false;
    Trigger:触发器类型,触发动画后会自动恢复为之前的状态。

    本次我们创建三个Float类型的参数:Horizontal、Vertical、Magnitude:
    Horizontal:触发播放向左或向右的动画;
    Vertical:触发播放向上或向下的动画;
    Magnitude:触发从Idle到移动的动画。

    5.调整Blend Tree属性

    Blend Tree属性面板
    我们使用Blend Type2D Simple Directional,这样我们的动画会受到两个动画参数影响。

    这里我们将Parameters选择为我们设置的HorizontalVertical
    接下来在下面点击+号,创建六个条件,每个条件如上图设置(如果有左上、右上、左下、右下的动画文件,可以进行相应替换),每个条件设置好Pos XPos Y后,上方就会出现一个完美的六边形。

    Pos X表示我们的Horizontal值大于方框内的值,Pos Y表示我们的Vertical值大于方框内的值,我们就会播放相应条件的动画,我们可以拖动中心的红点来预览动画,这个过程有点像手机游戏中的方向键圆盘:

    预览动画

    6.调整Idle到Blend Tree的过渡条件

    选中我们的Idle,右键Make Transition拉出一条线连接我们的Blend Tree,然后选中Blend Tree,右键Make Transition拉出一条线连接Idle:

    Make Transition
    完成之后如下:
    拉线完成
    选择Idle -> Walk的线(我已经将Blend Tree重命名为Walk),面板属性中按+号添加Magnitude大于0:
    Magnitude大于0

    选择Idle <- Walk的线,面板属性中按+号添加Magnitude小于0.001:

    Magnitude小于0.001

    Magnitude小于0.001其实相当于Magnitude等于0,由于浮点型的特殊性质,无法完全等于0,因此小于0.001就相当于等于0;
    Has Exit Time取消打勾,不会产生退出动画的时间;
    Transition Duration(s)设置为0,将会在动画和动画转换时没有过渡时间,直接转换。

    修改MovementController文件

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MovementController : MonoBehaviour
    {
        public Rigidbody2D rBody;
        public Animator animator;
        public float speed = 1;
    
        // Start is called before the first frame update
        void Start()
        {
            
        }
    
        // Update is called once per frame
        void Update()
        {
            
        }
    
        private void FixedUpdate()
        {
            Vector2 movement = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
            Vector2 targetPos = rBody.position + movement * Time.deltaTime * speed;
    
            animator.SetFloat("Horizontal", movement.x);
            animator.SetFloat("Vertical", movement.y);
            animator.SetFloat("Magnitude", movement.magnitude);
    
            rBody.MovePosition(targetPos);
        }
    }
    

    public Animator animator:获取动画控制器,如果只想自己使用,可以 使用animator = GetComponent<Animator>()获取;
    movement.magnitude代表长度,所以我们可以判断如果长度为0,则要变为Idle;如果长度大于0,我们就需要进入Walk的Blend Tree;
    animator.SetFloat("xxxxx", xxxx)这个方法就相当于开启动画的开关,我们根据方向按键的值来进行相关动画的播放;
    关于移动动画脚本相关:传送门

    7.挂载脚本预览效果

    脚本挂载
    动画效果

    相关文章

      网友评论

          本文标题:Unity 2D:混合动画树Blend Tree

          本文链接:https://www.haomeiwen.com/subject/zjkwqrtx.html