在前面只是实现不同动画之间进行无条件地转换执行,其实在游戏里,经常要切换动画执行的,比如让一个角色行走时播放的动画是行走的动画,如果角色要跳起来,播放的动画是跳动的动画,如果角色转身时,应该播放转身的动画。现在所有的动画都放到动画编辑器里了,如果想要动画在状态之间有条件地进行切换,就需要增加切换条件参数,这样才可以在脚本里设置触发条件。怎么样来添加触发切换状态的条件呢?下面就来解决这个问题。先要在动画编辑器里添加条件参数,如下图:
在这里点击Parameters选项面,然后出现添加状态转换参数,再点击下面的加号,就可以添加条件参数,如下图添加一个参数从空闲切换到跳动:
点击加号之后,会弹出一个菜单,这个菜单里有几种数据类型,在这里选择Bool类型,就可以添加像C处这样的参数,把这个参数的名称改为Standing_Jump,当设置为true表示从空闲切换到跳动,设置false时从跳动状态切换到空闲状态,如下图:
在这里,这个参数默认是false状态,因为后面那个选择框并没有勾选。
接着下来要把这个参数关联到切换连接线里,如下图:
在这里选中空闲到跳转的连接线,然后在右边看到条件添加列表地方,在那里点击加号,就可以把这个条件变量添加到状态里了,如下图:
从上图可以看到添加Standing_Jump,后面的true就是表示在代码设置为true时就可以播放跳动动画。同理,也可以设置相反的状态切换,点击从跳动到空闲的连接线,设置如下图:
这里设置状态为false从跳动切换到空闲状态。
通过上面几步的设置,就把动态的状态条件创建完成了,下一步就是创建脚本代码,编写相应的控制代码了。接着来创建一个脚本youCond.cs来绑定you这个对象,如下图:
点击A处的按钮,就可以添加脚本,把脚本命名为上面的名称。就可以打开脚本进行编辑,在里面添加下面的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class YouCond : MonoBehaviour {
private Animator anim;
private AnimatorStateInfo currentBaseState;
private float timeCount = 0.0f;
static int idleState = Animator.StringToHash("Base Layer.standing_idle");
static int jumpState = Animator.StringToHash("Base Layer.Standing_Jump");
// Use this for initialization
void Start ()
{
anim = GetComponent<Animator>();
timeCount = 0;
}
// Update is called once per frame
void Update ()
{
currentBaseState = anim.GetCurrentAnimatorStateInfo(0);
if (currentBaseState.fullPathHash == idleState)
{
if (Input.GetButtonUp("Jump"))
{
anim.SetBool("Standing_Jump", true);
Debug.Log("Jump");
timeCount = 0;
}
}
else if (currentBaseState.fullPathHash == jumpState)
{
Debug.Log("Jump......");
timeCount += Time.deltaTime;
if (timeCount > 5.0f)
{
anim.SetBool("Standing_Jump", false);
}
}
}
}
在这段代码里,主要使用Animator对象和AnimatorStateInfo对象,并且使用Animator.StringToHash()函数来计算指定动画的名称,这样计算出来的动画就是一串数字,可以大大地提高比较的速度,比字符串比较要快很多。同理,访问currentBaseState.fullPathHash也是为了更快的速度。
到这里,已经把人形动画学习完成了,也可以通过脚本进行触发指定的动画了。但还一个更复杂的动画Blend Tree,唯一的区别就是Montion指向的类型变成了Blend Tree类型,那么一个Blend Tree其实也就是一个状态,和状态不同的地方就是一个状态只能设定一个动画,而一个Blend Tree则可以设定为多个动画的混合。多个动画混合比较复杂,这里就不再学习了,有兴趣后面再自己学习。