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】动画回调函数、动画事件、动画曲线相关推荐

  1. Unity-动画-动画回调函数接口StateMachineBehaviour

    Unity-动画-动画回调函数接口StateMachineBehaviour 1. 简介 当你想在状态机的某个状态执行中干些什么的时候(增加状态机行为) 比如:播放音效,添加粒子特效,增加逻辑代码等等 ...

  2. jQuery 来了--动画,停止动画,回调函数Callback,链

    动画 animate()方法 作用:用于创建自定义动画 语法:$("selector").animate({params},speed,callback); 参数 params:必 ...

  3. lua cocos 动画回调

    最近项目有用到播放一个骨骼动画,播放完成后,启动另外一个动画,在此使用骨骼动画的回调函数实现.过程如下: 一.实现动画播放结束后的回调 1.得到动画,播放动画,并设置动画的回调函数 local arm ...

  4. jQuery事件动画

    目录: 一.jQuery事件 二.jQuery动画 (一)事件 1.加载Dom两种方式 1.1 window.onload方式(执行时间:整个网页中所有内容(包括图片)加载完成后,才会执行:编写个数: ...

  5. javascript之回调函数小知识

    Javascript异步编程方法------"回调函数" 这是异步编程最基本的方法. 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. ...

  6. 回调函数、Java接口回调 总结

    回调函数 谈到回调,我们得先从回调函数说起,什么叫回调函数呢? 回调函数是什么? 百度百科的解释:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针 ...

  7. 回调函数到底是怎么一回事呢

    今天看到回调函数,有点迷糊,找了好多搜索引擎的资料,都不是让我很能理解,看了<c和指针>我才明白了. 简单描述一下什么是回调函数: 用户把一个函数指针作为参数传递给其他函数,后者将&quo ...

  8. JavaScript高级day01-PM【对象、函数、回调函数、IIFE、this、关于语句分号问题、webstorm代码模板、复习】

    笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目   录 P7 07.尚硅谷_JS高级_对象 23:30 1. 什么是对象? 2. 为什么 ...

  9. OPENCV回调函数

    OPENCV回调函数 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...

最新文章

  1. 中小学教师职称计算机考试软件,中小学教师职称计算机考试大纲--2012年
  2. php 字符串表示,php字符串是否包含某字符串
  3. __getattr__ 与动态属性
  4. 在CMD窗口连接到Mysql
  5. leetcode算法题--简化路径
  6. 信息系统项目管理案例3
  7. 使用JScript设置SVN客户端hook
  8. 常用的函数式接口_Function接口_默认方法andThen
  9. Push rejected: Push to origin/master was rejected
  10. 罗氏制药世界搜索引擎跟踪,关键字 罗氏制药
  11. 使用JPA标准@ViewScoped通过分页,过滤和排序进行Primefaces DataTable延迟加载
  12. protected访问权限_权限修饰符 /重写
  13. 【人工智能】多标签图像分类综述
  14. 5年前我们摸爬滚打进入测试行业,如今你后悔吗?
  15. delphi mysql类_Delphi MySQL数据库操作类
  16. 多种方法使用c语言读写文件(总结)
  17. Centos8 部署Promethus(普罗米修斯)+grafana画图
  18. 九阴真经Ambari——3.安装并配置MariaDB
  19. 1675. Minimize Deviation in Array
  20. nemesis什么车_英国Mazda推出RX-8 Nemesis限量特式车

热门文章

  1. BES 优秀文章/博客搜集
  2. 我的个人博客:基于Solo的博客站点
  3. Graybox Overview
  4. Linux上如何清理内存缓存、缓冲与交换空间?
  5. Q3净利润同比下降67.83% 中兴通讯和华为终成“难兄难弟”?
  6. 2023 快乐二级域名分发系统源码v1.2 重置版
  7. 手机处理器的nm制造工艺
  8. mysql 日期加减天数
  9. 新卡盟排行榜源码 卡盟门户源码多个搜索引擎首页自适应模板
  10. android圆形图标