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 的值在动画执行过程中,在自动变化。

​ 声明:本文转自【Unity3D】动画回调函数、动画事件、动画曲线

【Unity3D】动画回调函数、动画事件、动画曲线的更多相关文章

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

    jquery动画函数里面可以跟一个回调函数,表示动画结束后执行的代码 使用js监听动画结束后进行的操作: $ele.fadeIn(300,function(){...}) $ele.fadeOut(3 ...

  2. Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧

    实际项目中会运到的 Typescript 回调函数.事件侦听的类型定义,如果刚碰到会一脸蒙真的,我就是 这是第一次我自己对 Typescript 记录学习,所以得先说一下我与 Typescript 的 ...

  3. animate动画回调函数

    对非动画的实现排队,比如这个css()是要放在回调函数里才能,让前面的动画执行完成后在进行实现 $('button').click(function(event) { $(this).next().a ...

  4. pysimplegui之第一个程序,包括回调函数,事件,阻塞等待内容

    自定义窗口 API 调用(您的第一个窗口) 总结一下:我遇到的坑, 比如拿输入框的内容的时候可以直接通过value[key] 几种窗口模式就是什么时候用timeout这个参数 关闭窗口可以的一边形式 ...

  5. 原生js判断css3动画过度(transition)结束 transitionend事件 以及关键帧keyframes动画结束(animation)回调函数 animationEnd 以及 css 过渡 transition无效

      上图的 demo 主要讲的 是 css transition的过渡回调函数transitionend事件: css3 的时代,css3--动画 一切皆有可能: 传统的js 可以通过回调函数判断动画 ...

  6. Unity---DOTween插件学习(2)---设置参数、Ease曲线、回调函数、动画控制函数

    目录 6.Set设置参数 7.Ease曲线 8.回调函数 9.动画控制函数 本文及系列参考于Andy老师的DOTween系列 欢迎大家关注Andy老师 6.Set设置参数 在Unity中添加一个Cub ...

  7. jQuery基础的动画里面的回调函数

    <style> *{margin:0; padding:0;} #target{ border-radius:10px; background:#eee; } .fade{/*动画起始状态 ...

  8. ReactNative学习实践--动画初探之加载动画

    学习和实践react已经有一段时间了,在经历了从最初的彷徨到解决痛点时的兴奋,再到不断实践后遭遇问题时的苦闷,确实被这一种新的思维方式和开发模式所折服,react不是万能的,在很多场景下滥用反而会适得 ...

  9. JavaScript 事件 事件流 事件对象 事件处理程序 回调函数 error和try...catch和throw

    参考资料: 慕课网 DOM事件探秘    js事件对象 处理 事件驱动: JS是采用事件驱动的机制来响应用户操作的,也就是说当用户对某个html元素进行操作的时候,会产生一个时间,该时间会驱动某些函数 ...

  10. JavaScript Event 事件 事件流 事件对象 事件处理程序 回调函数 error和try...catch和throw

    参考资料: 慕课网 DOM事件探秘    js事件对象 处理 事件驱动: JS是采用事件驱动的机制来响应用户操作的,也就是说当用户对某个html元素进行操作的时候,会产生一个事件,该事件会驱动某些函数 ...

随机推荐

  1. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.21)

    百度网盘会员账号共享(11.21更新) 账号:tgc91660 密码:6858hykh 账号:ofj51327 密码:rvzp3251 账号:5799osrb 密码:862lwtr 账号:3730sw ...

  2. 一个轻量快速的C++日志库

    limlog 作一篇文章记录实现,驱动优化迭代. 代码仓库 用法 实现 后端实现 前端实现 日期时间的处理 线程id的获取 日志行的其他项处理 优化 整形字符串格式化优化 测试 benchmark 性 ...

  3. [转帖]Docker最佳实践:5个方法精简镜像

    https://juejin.cn/post/6844903880526921741   精简Docker镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患.优化镜像大小的手段多种多样,因服 ...

  4. Oracle Preinstall 调优参数的学习

    Oracle Preinstall 调优参数的学习 背景 学习是一个痛苦并快乐的过程. 之前自己手工安装过很多套Oracle数据库,也总结过很多 但是很多都是比较皮毛的. 最近遇到了一些问题. 才发现 ...

  5. [转帖]LOAD DATA INFILE 导入数据

    https://www.jianshu.com/p/bcafd8f3ad8e LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并写入一个表中.文件名称必须为一个文字字符串.LOA ...

  6. [转帖]harbor-db restarting问题

    现象: 在安装harbor后,启动时发现harbor-db 一直是restarting,/harbor-jobservice,/harbor-core 这两是starting 状态,如下图 解决: 1 ...

  7. [转帖]jcmd命令详解

    1 基本知识 jcmd 是在 JDK1.7 以后,新增了一个命令行工具. jcmd 是一个多功能的工具,相比 jstat 功能更为全面的工具,可用于获取目标 Java 进程的性能统计.JFR.内存使用 ...

  8. [转帖]LVS入门篇(三)之LVS的工作模式和调度算法

    LVS入门篇(三)之LVS的工作模式和调度算法 https://www.cnblogs.com/linuxk/p/9358512.html 1.NAT模型 (1)原理图: ①.客户端(200.10.1 ...

  9. vue面试题(一)正在重新整理

    1.输入一个 URL到浏览器整个过程发生了什么?ok 1.浏览器查找当前 URL是否存有缓存,并检查这个缓存是否过期 2.DNS 解析 URL 对应的 IP 3.根据 IP 建立 TCP 连接(三次握 ...

  10. VictoriaMetrics 1.80版本中值得关注的新特性

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 change log请看:https://github.c ...