属性名 | 描述 |
---|---|
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 | 用于向状态添加“行为” |
直观上说它们就是连接不同状态的有向箭头
要创建一个从状态A
到状态B
的过渡,直接在状态A
上 鼠标右键 - Make Transition
并把出现的箭头拖拽到状态B
上点击鼠标左边即可。
参数有Float
,Int
,Bool
,Trigger
。
Float
、Int
用来控制一个动画状态的参数,比如速度方向等可以用数值量化的东西,
Bool
用来控制动画状态的转变,比如从走路转变到跑步,
Trigger
本质上也是bool
类型,但它默认为false
,且当程序设置为true
后,它会自动变回false
。
如下这里创建一个Int
类型的参数AnimState
点击连线,在Inspecter
窗口中可以进行设置,在Conditions
栏下可以添加条件,如下图表示当参数
AnimState
为0
时会执行这个动画Any State
到New Animation2
的过渡
必须在Parameters面板中添加了参数才可以在这里查看到,其次添加的条件为”与”关系,即必须同时满足。
我们可以通过代码来设置条件状态,达到动画切换的目的
Animator ator = go1.GetComponentAnimator>(); ator.SetInteger("AnimState", 0);
上面的代码,让AnimState
这个参数值为0
,满足了从Any State
到New Animation2
的过渡条件,从而实现New Animation2
动画的过渡。
在脚本中添加代码
//检查是否正在播放jump动画. AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(0); bool playingJump = stateinfo.IsName("jump"); if(playingJump) { if(stateinfo.normalizedTime 1.0f) { //正在播放 } else { //播放结束 } }
当处于状态jump
,则stateinfo.IsName("jump")
返回true
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.GetComponentAnimator>(); var stateinfo = ator.GetCurrentAnimatorStateInfo(0); if(stateinfo.IsName("Jump")) { ator.speed = 2; }
Can Transition To Self
,不然动画会出现抖动
不然如果没有下个状态切换,直接停止动作
Has Exit Time
,如果勾选了,则表示在该动作完成后才允许切换,
镜像,可以反转当前动画,减少动画师工作量
Mute
相当于把目标过渡禁用掉。Solo
表示只生效这一条过渡
可以多选,当选中后会出现箭头提示
条件满足优先于Solo/Mute
,当条件没有满足时依然不会过渡
以上就是关于Unity动画状态机Animator使用教程的详细内容,更多关于Unity动画状态机Animator使用的资料请关注脚本之家其它相关文章!