36.Animator动画器组件参数和代码控制

  1. 36.动画基础-Animator动画状态机-代码控制动画状态机切换
    1. 36.1 知识点
      1. 知识回顾 新动画系统创建动画
      2. Animator动画器组件参数
      3. Animator动画器代码控制
        1. Animator.SetXXX方法 通过状态机条件切换动画
        2. Animator.GetXXX方法 获得动画参数状态
        3. 假如切换时发现有延迟,可能是因为连线切换的参数中勾选了有推出时间,注意的话会播完上个动画在继续播下个动画。取消勾选即可。
    2. 36.2 知识点代码
    3. 36.3 练习题
      1. 使用Animator相关知识,请自己用Unity自带几何体拼凑一个机器人,有手有脚,为它制作两个动作,一个待机动作(站立不动),一个走路动作,我们可以通过键盘控制它移动切换动作
        1. 把用老动画系统练习题做的机器人拷贝过来,移除原来的脚本和Animation组件
        2. 创建Animator文件,给机器人根对象添加Animator组件关联刚刚创建的Animator文件
        3. 注意:假如把老动画系统的Animation文件拖到Animator窗口会有警告,运行时不起作用。直接选中机器人根对象在Animation窗口中新建Animation文件即可。创建Idle和Move动画,更改关节旋转并录制。
        4. 给两个状态添加连线。添加一个布尔型动画参数用于控制动画切换。注意要把退出时间取消勾选。
        5. 相比于老动画系统,新动画系统不用在初始的时候k多余的帧,会自动还原。
        6. 在Update中检测按下某些键时,修改动画参数进行动画的切换,并判断参数进行移动
    4. 36.4 练习题代码

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

×

喜欢就点赞,疼爱就打赏