Unity动画状态机Animator使用

一、前言

Unity可以用两种方式控制动画
1 Animation,这种方式简单,直接 Play(“Idle”)或者CorssFade(“Idle”)就可以播放动画;
2 AnimatorUnity5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑。

二、Animator组件

你通过Animation窗口(快捷键是Ctrl+6)中的Create New Clip创建Animation时,一个 Animator已经悄无声息地出现在了对应的GameObject
在这里插入图片描述

三、Animator Controller文件

在第一步中生成的Animator组件上, 第一个Controller参数在创建Animator时已经被赋值了,可以点击该值,并切换到Project窗口下,会发现这个 Controller对应的文件是一个.controller文件。
Animator Controller就是动画控制器,负责在不同的动画间切换,属于制作动画效果的必备原件。

在这里插入图片描述

注意,你也可以通过GameObject上的 Add Component添加一个崭新的 Animator组件,但是这种情况下 AnimatorController参数默认为空,所以需要我们手动将事先准备好的.controller文件拖拽到该参数位置,动画控制器才能正常工作。

四、Animation Clip文件

双击 .controller"文件,会弹出一个 Animator窗口,该窗口中显示的就是动画控制器文件中的所有内容(也可以在顶部的工具栏通过 Window - Animator打开这个界面)
在这里插入图片描述
Project窗口右键单击,选择Create->Animation创建Animation Clip.anim文件)
在这里插入图片描述
在这里插入图片描述
再把.anim文件拖拽进Animator窗口,作为Animator Controller的一个状态(State
在这里插入图片描述
通过Animator创建出来的Animation Clip无法直接通过挂Animation组件进行播放,如果强行播放,Console会报一条警告信息:

The AnimationClip 'XXX' used by the Animation component 'XXX' must be marked as Legacy.

以及一条提示信息

Default clip could not be found in attached animations list

如下
在这里插入图片描述
为什么呢?
如果我们把Inspector切换为Debug模式
在这里插入图片描述
可以看到Animation Clip有个Legacy勾选框
在这里插入图片描述
Legacy是遗产的意思,也就是传统的通过Animation组件来播放Animation Clip的做法,如果使用Animation组件来播放Animation Clip,则必须把Legacy勾选上,不过这种方式已经是过时的做法,推荐使用Animator来播放Animation Clip

五、 状态机的状态(State)

每个Animator Controller都会自带三个状态:Any State, EntryExit
在这里插入图片描述

1、Any State状态

表示任意状态的特殊状态。例如我们如果希望角色在任何状态下都有可能切换到死亡状态,那么Any State就可以帮我们做到。当你发现某个状态可以从任何状态以相同的条件跳转到时,那么你就可以用Any State来简化过渡关系。

2、Entry状态

表示状态机的入口状态。当我们为某个GameObject添加上Animator组件时,这个组件就会开始发挥它的作用。
如果Animator Controller控制多个Animation的播放,那么默认情况下Animator组件会播放哪个动画呢? 由Entry来决定的。
但是Entry本身并不包含动画,而是指向某个带有动画的状态,并设置其为默认状态。被设置为默认状态的状态会显示为 橘黄色。
在这里插入图片描述
当然,你可以随时在任意一个状态上通过 鼠标右键->Set as Layer Default State更改默认状态。
在这里插入图片描述

记住, EntryAnimator组件被激活后 无条件 跳转到默认状态,并且每个Layer有且仅有一个默认状态。

3、Exit状态

表示状态机的出口状态,以红色标识。如果你的动画控制器只有一层,那么这个状态可能并没有什么卵用。但是当你需要从子状态机中返回到上一层(Layer)时,把状态指向Exit就可以了。
在这里插入图片描述

六、动画状态的属性

我们可以选中某个自定义状态,并在Inspector窗口下观察它具有的属性
在这里插入图片描述

属性名描述
Motion状态对应的动画。每个状态的基本属性,直接选择已定义好的动画(Animation Clip)即可
Speed动画播放的速度。默认值为1,表示速度为原动画的1.0倍。
Mutiplier勾选右侧的Parameter后可用,即在计算Speed的时考虑 区域1 中定义的某个参数。若选择的参数为smooth, 则动画播放速度的计算公式为 smooth * speed * fps(animation clip中指定)
Mirror仅适用于humanoid animation(人型机动画)
Cycle Offset周期偏移,取值范围为0-1.0,用于控制动画起始的偏移量。把它和正弦函数的offset进行对比就能够理解了,只会影响起始动画的播放位置。
Foot IK仅适用于humanoid animation(人型机动画)
Write Default最好保持默认,感兴趣可以参考官方手册
Transitions该状态向其他状态发起的过渡列表,包含了Solo和Mute两个参数,在预览状态机的效果时起作用
Add Behaviour用于向状态添加“行为”

七、状态间的过渡关系(Transitions)

直观上说它们就是连接不同状态的有向箭头
在这里插入图片描述

要创建一个从状态A状态B的过渡,直接在状态A上 鼠标右键 - Make Transition并把出现的箭头拖拽到状态B上点击鼠标左边即可。
在这里插入图片描述

八、添加状态控制参数

参数有FloatIntBoolTrigger
在这里插入图片描述
FloatInt用来控制一个动画状态的参数,比如速度方向等可以用数值量化的东西,
Bool用来控制动画状态的转变,比如从走路转变到跑步,
Trigger本质上也是bool类型,但它默认为false,且当程序设置为true后,它会自动变回false

如下这里创建一个Int类型的参数AnimState
在这里插入图片描述

九、编辑切换状态的条件

点击连线,在Inspecter窗口中可以进行设置,在Conditions栏下可以添加条件,如下图表示当参数
AnimState0时会执行这个动画Any StateNew Animation2的过渡

必须在Parameters面板中添加了参数才可以在这里查看到,其次添加的条件为&&”与”关系,即必须同时满足。

在这里插入图片描述

十、代码中控制状态

我们可以通过代码来设置条件状态,达到动画切换的目的

Animator ator = go1.GetComponent<Animator>();
ator.SetInteger("AnimState", 0);

上面的代码,让AnimState这个参数值为0,满足了从Any StateNew Animation2的过渡条件,从而实现New Animation2动画的过渡。

十一、检查动画状态

方法1、AnimatorStateInfo

在脚本中添加代码

//检查是否正在播放jump动画.
AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(0);   
bool playingJump = stateinfo.IsName("jump");
if(playingJump)
{
	if(stateinfo.normalizedTime < 1.0f)
	{
		//正在播放
	}
	else
	{
		//播放结束
	}
	
}

当处于状态jump,则stateinfo.IsName("jump")返回true

方法2、继承StateMachineBehaviour

Animator的每个状态都可以挂载脚本,创建脚本,继承于StateMachineBehaviour类,用于检测状态机中动画切片(Anamation)的运行状态。
官方示例:https://docs.unity3d.com/ScriptReference/StateMachineBehaviour.html
将脚本挂载在对应的状态上即可。代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JumpState : StateMachineBehaviour
{
    private GameObject player;


    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // 正在played的状态的第一帧被调用
        Debug.Log("------OnStateEnter------------");
    }

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        
    }

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // 转换到另一个状态的最后一帧 被调用
        Debug.Log("-------------OnStateExit-----------------");
    }

    // OnStateMove is called right after Animator.OnAnimatorMove()
    override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    	// 在OnAnimatorMove之前被调用 
        
    }

    // OnStateIK is called right after Animator.OnAnimatorIK()
    override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // 在OnAnimatorIK之后调用,用于在播放状态时的每一帧的monobehavior。
        // 需要注意的是,OnStateIK只有在状态位于具有IK pass的层上时才会被调用。
        // 默认情况下,图层没有IK通道,所以这个函数不会被调用
        // 关于IK的使用,可以看看这篇文章《Animator使用IK实现头部及身体跟随》
        // https://www.jianshu.com/p/ae6d65563efa
    }
}

十二、控制播放速度

Animator ator = go1.GetComponent<Animator>();
var stateinfo = ator.GetCurrentAnimatorStateInfo(0);
if(stateinfo.IsName("Jump"))
{
	ator.speed = 2;
}

十三、注意事项

1 取消勾选 Can Transition To Self,不然动画会出现抖动
在这里插入图片描述

2 动作循环。不然如果没有下个状态切换,直接停止动作
在这里插入图片描述

3 Has Exit Time,如果勾选了,则表示在该动作完成后才允许切换,但是一般我们要的都是立即切换,所以这里 不要勾选
在这里插入图片描述

十四、补充

1、Mirror

镜像,可以反转当前动画,减少动画师工作量
在这里插入图片描述

2、Solo与Mute

Mute相当于把目标过渡禁用掉。Solo表示只生效这一条过渡
可以多选,当选中后会出现箭头提示
条件满足优先于Solo/Mute,当条件没有满足时依然不会过渡
在这里插入图片描述

  • 238
    点赞
  • 923
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
### 回答1: Unity Animator动画状态机是一种用于控制游戏对象动画的工具。它可以将不同的动画状态组合在一起,形成一个状态机。在状态机,每个状态代表一个动画,而状态之间的转换则代表不同的动画过渡。Animator动画状态机可以通过代码或可视化编辑器进行控制,使游戏对象的动画表现更加自然和流畅。 ### 回答2: Unity Animator 动画状态机是一个非常强大的工具,它可以被用来在Unity控制和管理角色或物体的动画。它允许开发者使用最先进的动画技术,以及一系列可定制的功能来创建各种动画效果。在Unity Animator状态机系统是动画的核心并且是非常重要的。状态机是一个包含一系列状态的图表,其每个状态都可以使用一定的逻辑从一个状态转换到另一个状态。状态机可以非常容易地控制对象的轨迹和动画效果,从而创造出非常酷的游戏体验。 在Unity,Animator组件是一个与对象一起工作的控制器,它可以控制Sprite、Mesh、GameObject,以及其他可见物体的动画。Animator动画状态机与控制器交互来指定GameObject在不同状态下的动画表现和响应动作的运动。Animator状态机的每个状态都有一个名称和一些条件,这些条件在满足时会导致状态之间的转换。开发人员可以使用条件控制器的事件和参数来更改这些条件,以使动画状态一直保持准确和高效的变化。 一个Animator状态机包括一些状态和转换条件。状态是单独的动画片段,每个状态都有一个名称、一个动画、一些参数和一些设置。转换条件指示Animator何时应该从一个状态切换到另一个状态。这些条件可以是像速度、位置或其他条件。 在Animator状态机,我们可以添加动画状态、行为状态、转换条件和逻辑控制节点。动画状态,可以是AnimationClip动画,也可以是BlendTree层级化混合动画,这些都是状态集合。行为状态,相当于一个事件触发机制,指定各种触发条件,使得AnimatorStateMachine能够更加智能、灵活地处理动画切换。转换条件,告诉它何时去切换到另一个状态。逻辑控制节点,可以通过判断条件来控制Animator state machine的逻辑。 总之,unity animator动画状态机是非常强大的动画开发工具,提供了多个状态和转换条件,允许开发人员完全掌控游戏对象的动画状态。它提供了一种更加直观的流程,通过图形界面创建动画状态流程,复杂的游戏逻辑也更更加高效和易于理解。 ### 回答3: Unity Animator动画状态机Unity引擎的一个核心组件,用于给游戏对象添加动态的动画效果。Animator状态机本质上是一种有限状态机(FSM),它可以将对象的状态从一种状态切换到另一种状态,例如从静止状态到跳跃状态,或从跳跃状态到攻击状态。Animator状态机的主要功能是让设计师和开发者创建和控制游戏对象的动画,并可以轻松地将动画与对象的其他行为和属性绑定在一起。 使用Animator状态机可以让游戏设计师和开发者更加灵活和高效地创建动画。Animator状态机由以下四个基本元素组成: 1. Animator Controller:Animator状态机央控制器,用于管理Animator状态机的多个状态以及它们之间的转换。 2. Animator State:Animator状态机的单个状态,代表了一个游戏对象的动画状态,例如跳跃、奔跑等。 3. Transition:表示状态之间的过渡,可以设置触发条件和过渡时间等参数。 4. Parameter:可以控制Animator状态机的状态转换,例如可以添加一个触发参数来控制状态转换的时机。 在Unity创建一个Animator状态机非常简单,只需在Assets文件夹创建一个Animator Controller文件,然后将其拖拽到一个游戏对象的Animator组件上即可。完成后就可以使用Animator状态机的多种元素来创建自己的动画了。 总之,Unity Animator动画状态机是一种强大的游戏开发工具,它为游戏设计师和开发者提供了非常灵活和高效的动画创建和控制方式,可以让游戏对象展现更生动的动态效果,提高游戏的可玩性和视觉效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值