为了方便演示,我们先心剑Unity工程项目,打开Asset Store 资源商店,找到Unity-chan下载之后导入。
在project项目视图中的 UnityChan/Arts/Models/ 中找到Unitychan模型文件 拖到场景里并添加一个plane平面
之后,我们在project视图中创建一个动画控制器,重命名为Anim如图所示
双击打开动画控制器视图:
在Animation文件夹中找到WAIT00动画文件,直接拖到动画视图中
回到场景中,选择UnityChan模型,运行游戏,可以看到Unitychan正在进行等待动画!
那么我们再次打开控制器,拖入Walk的动画,并且在wait00上面右键->Make Transition,添加一条路径到Walk上面。如图所示
在Paramers列表里面添加一个bool类型的变量,命名为isWalk
然后回到控制器试图,在路径上添加这个判断
同样设置一个返回的路径为false
然后我们在角色身上创建一个脚本,名字叫Anim,用来控制总动画。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent (typeof (Animator))]
public class Anim : MonoBehaviour {
private Animator animator;
// Use this for initialization
void Awake () {
animator = GetComponent<Animator> ();
}
public void Walk () {
animator.SetBool("IsWalk", true);
}
public void Stop () {
animator.SetBool("IsWalk", false);
}
// Update is called once per frame
void Update () {
}
}
再给角色添加一个脚本 ,命名为PlayerMove
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour {
// Use this for initialization
private float h;
private float v;
private Anim Anims;
public float Speed = 0.5f;
void Start () {
Anims = GetComponent<Anim>();
}
// Update is called once per frame
void Update () {
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical");
OnWalk(h,v);
}
void OnWalk(float h,float v){
transform.Translate(h*Speed*Time.deltaTime,0,v*Speed*Time.deltaTime);
if(Mathf.Abs(h)>0.1||Mathf.Abs(v)>0.1){
Anims.Walk();
}
else{
Anims.Stop();
}
}
}
如此 我们就会得到一个残缺不全的Chan动画:
为了避免这种情况,我们需要把Has exit time 去掉
这样的显示就比较符合常理。
下面我们来尝试制作一下动画混合树blend trees
首先在Animator动画试图的空白处点击右键,选择Create—From New Blend 这样就创建出了一个新的混合,重命名为Walk,在Inspector中选为2d
依旧在Parameters标签里面创建两个float类型的参数,重命名为InputH和InputV
在Motion选项里面添加4个Motion Field,创建参数
修改Parameters的参数,一个InputH,一个InputV
然后把前后左右四个动画添加进去
设置参数
返回layer Base 删除之前的walk动画,制作一个新的transation指向混合树walk并且设置变量
重复上一部,设置新的变量
再设置一个返回变量的路径
返回场景中把之前身上的脚本移除,创建一个新的脚本命名为AniControl:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AniControl : MonoBehaviour {
public Animator anim;
// Use this for initialization
private float h;
private float v;
void Start () {
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical") ;
Walk(h,v);
}
void Walk(float h,float v){
transform.Translate(h * 0.2f * Time.deltaTime,0,v * 0.5f * Time.deltaTime);
anim.SetFloat("InputH",h);
anim.SetFloat("InputV",v);
}
}