Unity动画之Blend Tree(混合树)

发表于2018-02-28
评论0 1.74w浏览
混合树 (Blend Tree) 用于允许通过按不同程度组合所有动画的各个部分来平滑混合多个动画,本篇文章和大家分享的是使用混合树动画实现人物在跑的状态下,才能进行转弯操作,和跳起动作的效果。

1、Unity中的动画混合树可以将几个动画文件很好的融合在一起其中Run是状态树:


参数Direction是浮点类型。上面概述为:动画状态可以是单个的动画文件,也可以是由动画文件融合成的状态树。勾选automate threshold可以修改thresl临界值

2、第一步已经在Unity面板中把先关参数配置好了,现在就需要用脚本来设置相关参数条件的实现。
using UnityEngine;  
using System.Collections;  
public class BlendTree : MonoBehaviour {  
    protected Animator animator;  
    public float DirectionDamoTime = 0.25f;  
    void Start () {  
        animator = GetComponent<Animator>();  
    }  
    void Update () {  
        if(animator)  
        {  
            AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);  
            if (stateInfo.IsName("Base Layer.Run"))//注意这里必须是Base Layer.Run   Base Layer是动画层的名称,用.的形式引出当前准备切换动画的动画状态名称  
            {  
                if (Input.GetKeyDown(KeyCode.Space))  
                    animator.SetBool("Jump", true);  
            }  
            else  
            {  
                animator.SetBool("Jump", false);  
            }  
            //在奔跑时才可以水平旋转  
            float horizontal = Input.GetAxis("Horizontal");  
            animator.SetFloat("Direction", horizontal, DirectionDamoTime, Time.deltaTime);  
            //控制idle到跑状态的切换  
            if (Input.GetKeyDown(KeyCode.W))  
            {  
                animator.SetFloat("Blend", 1.0f);  
            }  
            else if (Input.GetKeyUp(KeyCode.W))  
            {  
                animator.SetFloat("Blend", -0.1f);  
            }  
        }  
    }  
} 

3、基本概念
第二个参数如果变为负值可以修改动画运动的方向。动画混合树,实际上也是一个动画状态单元,和普通的动画状态不同的是,他可以混合多个动画。

4、在BlendTree 的2D融合图中:
设置为-1  可以让动画反向播放,在有向前走而没有向后走的动画时。

5、2D融合图的操作步骤:
a.在动画控制器中,建立默认状态为BlendTree

b.type选择2D,parameter自己创建参数,此参数会在脚本中运用到,并将四个动画文件子对象的相关位置设置好之后,在unity面板中的配置就完成了:

c.脚本的控制:
using UnityEngine;  
using System.Collections;  
public class BlendTree2D : MonoBehaviour {  
    private Animator ani;  
    public float xDampTime = 1.0f;  
    public float yDampTime = 1.0f;  
    //动画参数的系数  
    float xVal = 1.5f;  
    float yVal = 1.5f;  
    void Start () {  
        ani = gameObject.GetComponent<Animator>();  
    }  
    void Update () {  
        if(ani)  
        {  
            float h = Input.GetAxis("Horizontal");  
            float v = Input.GetAxis("Vertical");  
            ani.SetFloat("ValX", h, xDampTime, Time.deltaTime);  
            ani.SetFloat("ValY", v, yDampTime, Time.deltaTime);  
        }  
    }  
}  
这样就能很好的对角色进行,前进,后退,左右运动的控制了。

d.数值的大小,影响着动画播放的快慢。越小播放越快。
动画融合就是设置权重的大小将动画进行融合

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引