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动画回调函数动画事件动画曲线的主要内容,如果未能解决你的问题,请参考以下文章

在Vue中使用GSAP完成动画(三)动画事件

CocosCreator-如何处理Animation动画的结束回调

jquery动画函数里面可以跟一个回调函数,表示动画结束后执行的代码

DoTween插件的基本操作总结

如果应用了 css 过渡,为啥动画回调函数会立即触发?

JS如何监听动画结束