Unity 给Animator动画添加事件(动态的)

简介: 在 Unity 中,通过动画事件系统可在动画播放的特定时间点触发自定义函数。动态添加事件的步骤包括获取 `AnimationClip` 对象,创建并添加 `AnimationEvent`,最后调用 `Rebind()` 更新动画控制器。示例代码展示了如何在动画开始、中间和结束时触发事件,实现与游戏逻辑的交互。

在 Unity 中为 Animator 动画动态添加事件的原理主要涉及到利用 Unity 提供的动画事件系统和相关 API,下面从动画事件系统的工作机制、动态添加事件的步骤和原理详细展开:
动画事件系统工作机制
Unity 的动画事件系统允许开发者在动画播放的特定时间点触发自定义的函数。当动画播放到设置了动画事件的关键帧时,Unity 会自动调用与之关联的函数。这些事件可以用于触发音效、改变游戏状态、执行特定的逻辑等。动画事件本质上是将动画的播放过程与脚本中的函数进行关联,从而实现动画与游戏逻辑的交互。
动态添加事件的步骤及原理

  1. 获取动画剪辑(AnimationClip)
    要为动画添加事件,首先需要获取对应的动画剪辑对象。动画剪辑是包含动画数据的资源,存储了动画的关键帧、运动轨迹等信息。可以通过以下方式获取动画剪辑:

废话不多说了,直接上代码哦,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimatorEc : MonoBehaviour {
    public Animator ani;//人物的动画状态机
    public TrailRenderer trail; //拖尾效果
    private AnimationClip[] clips; //动画的集合
    // Use this for initialization
    void Start () {
        clips = ani.runtimeAnimatorController.animationClips;
        AnimationClip clip = clips[1]; //因为我的是在第二个,用的话需要自己设定clip[int]

        AddAnimationEvent(ani, clip.name, "StartEvent", 0);
        AddAnimationEvent(ani, clip.name, "HalfEvent", clip.length * 0.5f);
        AddAnimationEvent(ani, clip.name, "EndEvent", clip.length);

    }
    private void Update()
    {
        if (Input.GetMouseButtonDown (0))
        {
            ani.SetBool("fack", true);
        }
        else
        {
            ani.SetBool("fack", false);
        }
    }
   /// <summary>
   /// 给动画添加新的事件
   /// </summary>
   /// <param name="_Animator"> 人物的状态机</param>
   /// <param name="_ClipName">动画的名称</param>
   /// <param name="_EventFunctionName">时间/秒</param>
   /// <param name="_time"></param>
    private void AddAnimationEvent(Animator _Animator, string _ClipName, string _EventFunctionName, float _time)
     {
         AnimationClip[] _clips = _Animator.runtimeAnimatorController.animationClips;
         for (int i = 0; i<_clips.Length; i++)
         {
            if (_clips[i].name == _ClipName)
             {
                AnimationEvent _event = new AnimationEvent();
                 _event.functionName = _EventFunctionName;
                _event.time = _time;
                 _clips[i].AddEvent(_event);
                break;
            }
         }
        _Animator.Rebind();
     }
    private void StartEvent()
    {
        Debug.Log("开始播放动画");
    }
    private void HalfEvent()
    {
        trail.emitting = true;
        Debug.Log("动画放到一半的时候");
    }
    private void EndEvent()
    {
        trail.emitting = false;
        Debug.Log("动画结束的时候");
    }
    /// <summary>
    /// 清除所有的事件
    /// </summary>
    private void ClearAllEvent()
     {
         for (int i = 0; i<clips.Length; i++)
         {
             clips[i].events = default(AnimationEvent[]);
         }
        Debug.Log("清除所有事件");
     }

    private void OnDestroy()
    {

        ClearAllEvent();
    }
}

最后自行测试即可

相关文章
|
7月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
397 6
|
6月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
358 3
|
7月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
6月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
286 0
|
7月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
196 0
|
7月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
251 0
|
7月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
228 0
|
7月前
|
图形学
Unity动画☀️Unity动画系统Bug集合
Unity动画☀️Unity动画系统Bug集合
|
7月前
|
图形学
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
|
7月前
|
图形学