36.动画基础-Animator动画状态机-代码控制动画状态机切换
36.1 知识点
知识回顾 新动画系统创建动画
Animator动画器组件参数
Controller 控制器
对应的动画控制器(状态机)Avatar
对应的替身配置信息(之后讲解3D模型时详细讲解)Apply Root Motion 应用根运动
是否启用动画位移更新UpdateMode 更新模式(一般不修改它)
- Normal:正常更新
- Animate Physics:物理更新
- Unscaled Time:不受时间缩放影响
Culling Mode 裁剪剔除模式
- Always Animate:始终播放动画,即使在屏幕外也不剔除
- Cull Update Transforms:摄像机没有渲染该物体时,停止位置、IK的写入
- Cull Completely:摄像机没有渲染物体时,整个动画被完全禁用
Animator动画器代码控制
先获得Animator组件
//我们用代码控制状态机切换主要使用的就是Animator提供给我们的API
//我们知道一共有四种切换条件 int float bool trigger
//所以对应的API也是和这四种类型有关系的
animator = this.GetComponent<Animator>();
Animator.SetXXX方法 通过状态机条件切换动画
//通过状态机条件切换动画
//设置动画参数状态
//animator.SetFloat("条件名", 1.2f);
//animator.SetInteger("条件名", 5);
//animator.SetBool("条件名", true);
//animator.SetTrigger("条件名");
Animator.GetXXX方法 获得动画参数状态
//获得动画参数状态
//animator.GetFloat("条件名");
//animator.GetInteger("条件名");
//animator.GetBool("条件名");
//直接切换动画 除非特殊情况 不然一般不使用
//animator.Play("状态名");
//注意:状态名和动画名不一样 动画名拖进来默认名字就是状态名 但是可以修改的和动画名不一样的
假如切换时发现有延迟,可能是因为连线切换的参数中勾选了有推出时间,注意的话会播完上个动画在继续播下个动画。取消勾选即可。
36.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson36_动画基础_Animator动画状态机_代码控制动画状态机切换 : MonoBehaviour
{
private Animator animator;
void Start()
{
#region 知识回顾 新动画系统创建动画
#endregion
#region 知识点一 关键组件Animator参数相关
//参数相关
#endregion
#region 知识点二 Animator中的API
//我们用代码控制状态机切换主要使用的就是Animator提供给我们的API
//我们知道一共有四种切换条件 int float bool trigger
//所以对应的API也是和这四种类型有关系的
animator = this.GetComponent<Animator>();
//通过状态机条件切换动画
//设置动画参数状态
//animator.SetFloat("条件名", 1.2f);
//animator.SetInteger("条件名", 5);
//animator.SetBool("条件名", true);
//animator.SetTrigger("条件名");
//获得动画参数状态
//animator.GetFloat("条件名");
//animator.GetInteger("条件名");
//animator.GetBool("条件名");
//直接切换动画 除非特殊情况 不然一般不使用
//animator.Play("状态名");
//注意:状态名和动画名不一样 动画名拖进来默认名字就是状态名 但是可以修改的和动画名不一样的
#endregion
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
animator.SetBool("change", true);
}
if (Input.GetKeyDown(KeyCode.S))
{
animator.SetBool("change", false);
}
}
}
36.3 练习题
使用Animator相关知识,请自己用Unity自带几何体拼凑一个机器人,有手有脚,为它制作两个动作,一个待机动作(站立不动),一个走路动作,我们可以通过键盘控制它移动切换动作
把用老动画系统练习题做的机器人拷贝过来,移除原来的脚本和Animation组件
创建Animator文件,给机器人根对象添加Animator组件关联刚刚创建的Animator文件
注意:假如把老动画系统的Animation文件拖到Animator窗口会有警告,运行时不起作用。直接选中机器人根对象在Animation窗口中新建Animation文件即可。创建Idle和Move动画,更改关节旋转并录制。
给两个状态添加连线。添加一个布尔型动画参数用于控制动画切换。注意要把退出时间取消勾选。
相比于老动画系统,新动画系统不用在初始的时候k多余的帧,会自动还原。
在Update中检测按下某些键时,修改动画参数进行动画的切换,并判断参数进行移动
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
animator.SetBool("isMoving", true);
else if (Input.GetKeyUp(KeyCode.W))
animator.SetBool("isMoving", false);
if( animator.GetBool("isMoving") )
{
this.transform.Translate(Vector3.forward * 5 * Time.deltaTime);
}
}
36.4 练习题代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson36_练习题 : MonoBehaviour
{
private Animator animator;
void Start()
{
#region 练习题一
//使用Animator相关知识
//请自己用Unity自带几何体拼凑一个机器人,有手有脚
//为它制作两个动作,一个待机动作(站立不动),一个走路动作
//我们可以通过键盘控制它移动切换动作
animator = this.GetComponent<Animator>();
#endregion
}
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
animator.SetBool("isMoving", true);
else if (Input.GetKeyUp(KeyCode.W))
animator.SetBool("isMoving", false);
if( animator.GetBool("isMoving") )
{
this.transform.Translate(Vector3.forward * 5 * Time.deltaTime);
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com