Unity3D动画回调函数动画事件动画曲线
Posted little_fat_sheep
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D动画回调函数动画事件动画曲线相关的知识,希望对你有一定的参考价值。
1 动画回调函数
动画回调函数是指动画在开始时、执行中、结束时回调的函数,主要有:OnStateEnter、OnStateUpdate、OnStateExit、OnStateMove、OnStateIK。
1)动画状态判断
Animator animator = GetComponent<Animator>();
int layerIndex = 0; // 动画层号
// 判断当前正在运行的动画是否是指定的动画
animator.GetCurrentAnimatorStateInfo(layerIndex).IsName("animationName");
// 判断动画是否处于过度状态
animator.IsInTransition(layerIndex);
2)添加回调函数脚本
在 Animator 窗口选中动画,在 Inspector 窗口点击 Add Behaviour 按钮,输入脚本名为 StatusMachine。
打开 StatusMachine 脚本如下:
using UnityEngine;
public class StatusMachine : StateMachineBehaviour
// 进入状态调一次
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
// 在状态中每帧调用一次
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
// 离开状态调用一次
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
// 动画对象移动时(动画未设置烘焙位置Bake Info Pose), 每帧调用一次
override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
// 在Animator.OnAnimatorIK()之后调用, IK(逆向运动学)的实现可以写在这里(需要开启IK Pass)
override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
说明:IK(Inverse kinematics)是指逆向运动学,是指手或足带动身体运动,如:开枪时,枪的震动带动手动,手带动胳膊动,胳膊带动身体动。
2 动画事件
动画回调函数只能给特殊帧(如:首帧、尾帧)添加回调方法,不能给任意帧添加回调方法,动画事件能够做到给任意帧添加回调方法。
1)人体动画添加动画事件
在 Assets 窗口选中人体动画资源文件,在 Inspector 窗口点击 Edit 按钮进入动画编辑页面,再根据以下步骤添加动画事件。
注意:添加完动画事件后,需要在挂载动画 Animator 组件的游戏对象的脚本组件里实现动画事件函数,并且使用 public void 修饰,入参最多只有一个,可以是 float、int、string、object 中的任意一种,如下:
using UnityEngine;
public class AnimationController : MonoBehaviour
public void Jump()
Debug.Log("Jump");
2)自定义动画添加动画事件
在 Assets 窗口选中自定义动画资源文件,按 Ctrl + 6 打开 Animation 窗口,按如下步骤添加动画事件。
注意:添加完动画事件后,需要在挂载动画 Animator 组件的游戏对象的脚本组件里实现动画事件函数,并且使用 public void 修饰。
3 动画曲线
动画回调函数、动画事件都是回调一个方法。如果在动画执行过程中,有一个变量随着动画执行的时间在变化,用户期望在任意时刻都能获取到这个变量的值,这个可以基于动画曲线实现。
1)创建动画曲线
在 Assets 窗口选中人体动画资源文件,在 Inspector 窗口点击 Edit 按钮进入动画编辑页面,再根据以步骤面添加动画曲线。
2)创建同名 float 类型变量
3)获取变量值
public class ActionController : MonoBehaviour
private Animator animator;
private void Awake()
animator = GetComponent<Animator>();
private void Update()
if (animator.GetCurrentAnimatorStateInfo(0).IsName("HumanoidIdleJumpUp"))
float testCurve = animator.GetFloat("TestCurve");
Debug.Log("TestCurve=" + testCurve);
说明:ActionController 脚本组件挂在播放 HumanoidIdleJumpUp 动画的游戏对象上。
4)运行结果
可以看到,TestCurve 的值在动画执行过程中,在自动变化。
在Vue中使用GSAP完成动画(三)动画事件
参考技术A动画时间都有回调函数,回调函数参数,作用域三种,本文着重讲第一种,后面的不再赘述
在动画结束时触发此回调函数
传递给 onComplete 回调函数的参数数组
如果想传递动画对象本身,可以使用 self
定义 onComplete 函数的作用域,即函数内this的指向
当动画开始渲染时执行此事件函数, 有可能会被执行多次 ,因为动画是可以 重复开始 的
当动画发生改变时(动画进行中的每一帧) 不停 的触发此事件
当一个补间动画被另外一个补间动画覆盖时发生的事件
获取或者设置事件,例如"onComplete", "onUpdate", "onStart", "onReverseComplete" , "onRepeat" (onRepeat 只应用在 TweenMax 或者 TimelineMax 实例),以及应传递给该回调的任何参数
下面两种方式等同
每个动画实例的每个回调类型只能有一个(一个onComplete, 一个onUpdate, 一个onStart, 等等),新建则会覆盖掉之前的。
可以通过设置null来删除掉回调函数
可用于链式操作同时绑定多种事件
以上是关于Unity3D动画回调函数动画事件动画曲线的主要内容,如果未能解决你的问题,请参考以下文章
CocosCreator-如何处理Animation动画的结束回调