【Unity动画】状态机添加参数控制动画切换(Animator Controller)

Unity - 手册:动画参数

  Byleoyang@数字媒体技术,抄袭必究

在Unity 动画状态机中,我们实现了播放动画片段,当我们有多个动画片段的时候,状态机就像一个调度中心,可以控制播放不同的动画片段(比如走、跑、射击、下蹲、防御、攻击动作)。但是不同的动画片段直接需要切换,既然切换就需要过渡,我们在状态机用一根线表示两个动画之间的过渡。

这些过度能够让两个动画切换更加自然,就像PR剪辑中,为两个视频添加了技巧转场(交叉叠化等)。

并且可以创建一些公用参数(Parameters),通过Animator类存储对应游戏物体的状态机,然后调用setBool(“参数”,你指定的参数数值)、setFloat(“参数”,你指定的参数数值)、setIntger(“参数”,你指定的参数数值)来设置。

参数可以作为条件添加到每一根线上面,从而控制动画的切换!

在Unity中,动画状态的切换是通过Animator Controller中的过渡(Transition)来实现的。过渡是状态之间的连接,控制过渡一般都是靠调用代码参数

我们来实现一个案例:

1.创建动画状态机(Animator Controller): 在Unity中,你可以通过创建Animator Controller来管理动画状态。在Unity编辑器中,右键点击Assets窗口,选择Create -> Animator Controller。然后,给它一个合适的名字,如"MyAnimatorController"。

2.创建动画状态: 在Animator Controller中,你可以添加各种动画状态。每个状态代表一个动画片段,比如站立、行走、跳跃等。你可以通过拖拽动画资源到Animator Controller中来创建这些状态。

3.设置过渡: 在状态之间建立过渡关系。选中一个状态,然后右键,Make Transition,就会创建一根线,这个线指向要过渡的动画片段。

4.设置过渡条件: 选中你要控制的动画过渡线,然后右边弹出该过渡线的属性,最下面Conditions(触发条件)点击加号,自动弹出左边新增的公共变量,自己任选,最好对应起来。

 5.使用脚本控制参数: 在游戏脚本中,你可以通过调用Animator组件的方法来修改动画参数的值。例如,使用animator.SetFloat("Forward", v);可以设置名为"Forward"的浮点数参数的值为变量v。

 6.触发状态切换: 当动画参数的值满足过渡条件时,Animator Controller会自动触发状态切换。这可能导致从一个状态过渡到另一个状态,并播放相应的动画。

在脚本种通过

animator.SetFloat("Forward", v);

animator.SetFloat("Strafe", h);

animator.SetBool("Fire", fire);

动画参数的值被设置为输入变量,这可能触发Animator Controller中的状态切换。

  • Integer - 整数
  • Float - 带有小数部分的数字
  • Bool - true 或 false 值(由复选框表示)
  • 触发器 - 一个布尔参数,当过渡使用时由控制器重置(由圆形按钮表示)

可以使用 Animator 类中的函数从脚本中为参数赋值:SetFloatSetIntegerSetBoolSetTrigger 和 ResetTrigger

完整代码参考

using UnityEngine;
using System.Collections;

public class SimplePlayer : MonoBehaviour {
    
    Animator animator;
    
    // Use this for initialization
    void Start () {
        animator = GetComponent<Animator>();
    }
    
    // Update is called once per frame
    void Update () {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        bool fire = Input.GetButtonDown("Fire1");

        animator.SetFloat("Forward",v);
        animator.SetFloat("Strafe",h);
        animator.SetBool("Fire", fire);
    }

    void OnCollisionEnter(Collision col) {
        if (col.gameObject.CompareTag("Enemy"))
        {
            animator.SetTrigger("Die");
        }
    }
}

注意:我们自己设置的参数除了可以控制动画的过渡,也可以控制动画混合树内部的动作切换,这些参数就像你在代码声明的全局变量,本身不属于任何一个人,而是一个公用的“开关”

参数的其他目的和用途:

  1. 用户输入的响应: 在你提供的脚本中,通过获取用户的输入,比如水平和垂直输入,以及按钮的按下,这些输入值被用作动画参数。这样,动画系统就可以根据用户的实际操作来控制动画的播放,使动画更加生动和交互式。

  2. 外部事件的触发: 动画不仅可以由用户输入触发,还可以由游戏中的事件触发。例如,在脚本中,当角色与敌人发生碰撞时,触发了名为"Die"的触发器参数,这会导致动画状态机切换到死亡状态。这样,动画可以根据游戏中的具体事件进行相应的调整。

  3. 动画状态切换的条件: 在动画状态机中,状态之间的切换通常需要满足一些条件。这些条件可以是动画参数的值达到某个阈值,或者某个触发器参数被激活。通过设置参数,你可以灵活地控制状态之间的切换逻辑。

  4. 实现动画混合: 在使用混合树(Blend Tree)时,参数的变化可以用来控制不同动画层的权重。这样可以实现平滑的过渡和混合,使动画过渡更加自然。(看后续教程)

总的来说,设置参数使得动画系统能够与游戏逻辑和用户输入相互关联,使得动画在运行时能够根据外部条件的变化而动态调整,从而增强了动画的表现力和交互性。这种动态的调整和响应是游戏中实现生动和流畅动画的关键。

猜你喜欢

转载自blog.csdn.net/leoysq/article/details/134762203