• 【Unity3D】动画回调函数、动画事件、动画曲线


    1 动画回调函数

            动画回调函数是指动画在开始时、执行中、结束时回调的函数,主要有:OnStateEnter、OnStateUpdate、OnStateExit、OnStateMove、OnStateIK。

            1)动画状态判断

    1. Animator animator = GetComponent();
    2. int layerIndex = 0; // 动画层号
    3. // 判断当前正在运行的动画是否是指定的动画
    4. animator.GetCurrentAnimatorStateInfo(layerIndex).IsName("animationName");
    5. // 判断动画是否处于过度状态
    6. animator.IsInTransition(layerIndex);

            2)添加回调函数脚本

            在 Animator 窗口选中动画,在 Inspector 窗口点击 Add Behaviour 按钮,输入脚本名为 StatusMachine。

            打开 StatusMachine 脚本如下:

    1. using UnityEngine;
    2. public class StatusMachine : StateMachineBehaviour {
    3. // 进入状态调一次
    4. override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    5. }
    6. // 在状态中每帧调用一次
    7. override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    8. }
    9. // 离开状态调用一次
    10. override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    11. }
    12. // 动画对象移动时(动画未设置烘焙位置Bake Info Pose), 每帧调用一次
    13. override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    14. }
    15. // 在Animator.OnAnimatorIK()之后调用, IK(逆向运动学)的实现可以写在这里(需要开启IK Pass)
    16. override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    17. }
    18. }

            说明:IK(Inverse kinematics)是指逆向运动学,是指手或足带动身体运动,如:开枪时,枪的震动带动手动,手带动胳膊动,胳膊带动身体动。

    2 动画事件

            动画回调函数只能给特殊帧(如:首帧、尾帧)添加回调方法,不能给任意帧添加回调方法,动画事件能够做到给任意帧添加回调方法。

            1)人体动画添加动画事件

            在 Assets 窗口选中人体动画资源文件,在 Inspector 窗口点击 Edit 按钮进入动画编辑页面,再根据以下步骤添加动画事件。

             注意:添加完动画事件后,需要在挂载动画 Animator 组件的游戏对象的脚本组件里实现动画事件函数,并且使用 public void 修饰,入参最多只有一个,可以是 float、int、string、object 中的任意一种,如下:

    1. using UnityEngine;
    2. public class AnimationController : MonoBehaviour {
    3. public void Jump() {
    4. Debug.Log("Jump");
    5. }
    6. }

            2)自定义动画添加动画事件

             在 Assets 窗口选中自定义动画资源文件,按 Ctrl + 6 打开 Animation 窗口,按如下步骤添加动画事件。

            注意:添加完动画事件后,需要在挂载动画 Animator 组件的游戏对象的脚本组件里实现动画事件函数,并且使用 public void 修饰。

    3 动画曲线

            动画回调函数、动画事件都是回调一个方法。如果在动画执行过程中,有一个变量随着动画执行的时间在变化,用户期望在任意时刻都能获取到这个变量的值,这个可以基于动画曲线实现。

            1)创建动画曲线

            在 Assets 窗口选中人体动画资源文件,在 Inspector 窗口点击 Edit 按钮进入动画编辑页面,再根据以步骤面添加动画曲线。

            2)创建同名 float 类型变量

            3)获取变量值

    1. public class ActionController : MonoBehaviour {
    2. private Animator animator;
    3. private void Awake() {
    4. animator = GetComponent();
    5. }
    6. private void Update() {
    7. if (animator.GetCurrentAnimatorStateInfo(0).IsName("HumanoidIdleJumpUp")) {
    8. float testCurve = animator.GetFloat("TestCurve");
    9. Debug.Log("TestCurve=" + testCurve);
    10. }
    11. }
    12. }

            说明:ActionController 脚本组件挂在播放 HumanoidIdleJumpUp 动画的游戏对象上。

            4)运行结果

             可以看到,TestCurve 的值在动画执行过程中,在自动变化。

  • 相关阅读:
    序列召回基础+GRU4Rec论文阅读
    渗透中常用的在线工具和网站总结
    一维数组、二维数组学习内容
    Python爬虫:如何下载汽车之家的数据(完整代码)
    什么是分布式锁?几种分布式锁分别是怎么实现的?
    【Java面试】大厂裁员,小厂倒闭,如何搞定面试官Java SPI是什么?有什么用?
    科技的成就(三十六)
    蔚来杯“2022牛客暑期多校训练营10
    计算机导论真题(一)
    【华为OD机试真题 JS】喊7的次数重排
  • 原文地址:https://blog.csdn.net/m0_37602827/article/details/126339172