Unity Animation Event 动画事件使用教程 及事件无法触发不触发的解决办法

本文介绍如何使用Unity中的AnimationEvent,包括通过动画控制器和代码两种添加方法。解释了如何设置事件帧及其绑定方法,并提供了可能遇到的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Animation Event ,顾名思义,就是动画中的事件。比如我们现在有这样的需求:当前模型移动到某个位置后触发一个自定义的事件,然后再移动回来,这时就需要调用Animation event来实现了。
Animator 和Animation相关的使用说明可以看这篇文章
https://blog.csdn.net/lengyoumo/article/details/106506810

Animation Event 的使用方法

使用Animation Event有两种方法。一种是通过代码添加事件。一种是使用可视化动画控制器来添加事件。个人比较推荐动画控制器的添加方式,因为这样更加直观而且修改更加方便。下面分别说说这两种事项方式

一 通过动画控制器添加事件

步骤:

  1. 在animator绑定的物体上添加一个新脚本,并写入触发事件后要调用的方法。要注意这个脚本不能放在其他物体上,否则控制器可能会找不到。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RbotArmController : MonoBehaviour
{
	// 事件触发后 将要调用的方法
    public void PrintEvent(int i)
    {
        print("PrintEvent: " + i + " called at: " + Time.time);
    }
}
  1. 在animation 控制器中的时间线上添加事件帧。
    2.1 找到你的.anim动画文件并打开它的控制器窗口
    在这里插入图片描述
    2.2 点击时间线上需要触发事件的位置,然后点击添加事件帧按钮即可生成。

  2. 事件帧绑定方法
    点击时间线上刚刚创建的事件帧,Inspector窗口中就出现了相应的设置选项。function这里填写我们在脚本中创建的方法名:PrintEvent,下面的float、int、object、string是要传递的参数。可以不填。
    在这里插入图片描述
    到这一步就已经实现了关键帧添加。当动画进行到事件关键帧就会触发绑定好的相关事件。

二 通过代码方式添加事件
  1. 这个脚本创建在哪里都行,只要绑定好animator即可。脚本无法访问到通过控制器创建的事件关键帧,只能自己创建事件关键帧,并设置相关的事件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RbotArmController : MonoBehaviour
{
	// 指定animation 动画控制器,在脚本所在的物体上直接拖拽即可
    public Animator armAnimator;
    private void Start()
    {
    	// 创建一个事件
        AnimationEvent evt = new AnimationEvent();
        // 绑定触发事件后要执行的方法名
        evt.functionName = "PrintEvent";
        // 执行方法后要传入的参数
        evt.intParameter = 12345;
        // 设置事件关键帧的位置,当事件过了1.3秒后执行
        evt.time = 1.3f;
        // 设置目标动画剪辑
        AnimationClip clip = armAnimator.runtimeAnimatorController.animationClips[0];
        // 绑定事件
        clip.AddEvent(evt);
    }
    // 触发事件后,要执行的方法
    public void PrintEvent(int i)
    {
        print("PrintEvent: " + i + " called at: " + Time.time);
    }
}
  1. 绑定相关的animator
    将脚本放到某个物体上,然后拖拽动画所在的animator到armAnimator上,即可完成绑定
    这时,当动画播放到1.3秒所在的时间线位置时,绑定的相关方法就会触发。
Animation Event无法触发的解决办法
  1. 如果是通过animation控制器添加的事件,要注意脚本是否和animator所在的对象所处同一对象。
  2. 如果是代码的添加方法,注意不能放在基类当中。就是说如果你的 脚本继承了某个基类,而事件的响应方法在基类中,那么这样可能会无法成功触发方法。
  3. 同时使用代码和动画控制器的方式添加,要注意是否有冲突。
  4. 在动画控制器上添加关键帧时,要注意是否多点了导致同一时间位置添加了你没注意到的多个事件帧,这样会导致不易定位且不会影响主进程的报错
引用\[1\]和\[2\]提到了一些关于Unity动画的优化方法。Unity在估算动画时会尽量保持开销最低,向Animator添加另一层的成本取决于层播放的动画和混合树。当层的权重为零时,Unity会跳过层的更新。为了优化动画,可以将Animator的Culling Mode设置为Based on Renderers,并禁用蒙皮网格渲染器的Update When Offscreen属性,这样在角色可见时,Unity会更新动画。\[1\]\[2\] 引用\[3\]提到了Animation Event,它是动画中的事件。通过Animation Event,可以在动画播放到特定位置时触发自定义事件。比如,当模型移动到某个位置后触发一个事件,然后再移动回来,就可以使用Animation Event来实现。关于Animator和Animation的更多使用说明,可以参考这篇文章:https://blog.csdn.net/lengyoumo/article/details/106506810\[3\] 综上所述,如果你想在Unity使用动画,可以根据需要优化动画的层和权重,设置Animator的Culling Mode和禁用蒙皮网格渲染器的Update When Offscreen属性。同时,你还可以使用Animation Event来实现在动画播放过程中触发自定义事件的功能。 #### 引用[.reference_title] - *1* *2* [UnityAnimation](https://blog.csdn.net/qq_45548042/article/details/120973774)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Unity Animation Event 动画事件使用教程事件无法触发触发解决办法](https://blog.csdn.net/lengyoumo/article/details/110957550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千年奇葩

从来没受过打赏,这玩意好吃吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值