unity 中向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。

示例一

 
    using UnityEngine;
    using System;
 
    public static class AnimationUtils
    {
        /// <summary>
        /// 向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。
        /// </summary>
        /// <param name="_animator">需要添加动画事件的 Animator 组件。</param>
        /// <param name="_clipName">目标动画片段的名称。</param>
        /// <param name="_functionName">当动画事件触发时调用的方法名称。</param>
        /// <param name="_time">事件触发的时间(以秒为单位)。</param>
        /// <param name="_callback">事件触发时的回调方法。</param>
        public static void AddAnimationEventAndPlay(Animator _animator, string _clipName, string _functionName, float _time, Action _callback)
        {
            // 获取 Animator 的所有动画片段
            AnimationClip[] _clips = _animator.runtimeAnimatorController.animationClips;
 
            // 检查是否找到了动画片段
            bool clipFound = false;
 
            // 遍历所有动画片段
            for (int i = 0; i < _clips.Length; i++)
            {
                // 检查动画片段名称是否匹配
                if (_clips[i].name.Equals(_clipName))
                {
                    clipFound = true; // 标记找到动画片段
                    // 创建新的动画事件
                    AnimationEvent _event = new AnimationEvent
                    {
                        functionName = _functionName, // 设置事件调用的方法名称
                        time = _time // 设置事件触发的时间
                    };
                    _clips[i].AddEvent(_event); // 将事件添加到动画片段
                    Debug.Log($"动画事件已添加到 '{_clipName}' 动画片段,方法: '{_functionName}',时间: {_time} 秒。");
 
                    // 获取动画片段的时长
                    float clipLength = _clips[i].length;
                    Debug.Log($"动画片段 '{_clipName}' 的时长为: {clipLength} 秒。");
 
                    // 播放动画
                    _animator.Play(_clipName); // 播放指定的动画片段
 
                    // 注册回调
                    if (_callback != null)
                    {
                        _callback.Invoke(); // 调用回调方法
                    }
                    break; // 找到后退出循环
                }
            }
 
            // 如果没有找到动画片段,输出警告
            if (!clipFound)
            {
                Debug.LogWarning($"未找到名为 '{_clipName}' 的动画片段。");
            }
 
            // 重新绑定 Animator,以确保使用最新的动画事件
            _animator.Rebind();
        }
    }
 
    public class AnimationEventExample : MonoBehaviour
    {
        public Animator animator; // 关联的 Animator 组件
        public string animationClipName = "YourAnimationClip"; // 动画片段名称
        public string eventFunctionName = "YourEventFunction"; // 事件方法名称
        public float eventTime = 1.0f; // 事件触发时间
 
        void Start()
        {
            // 调用 AddAnimationEventAndPlay 方法,并传入回调
            AnimationUtils.AddAnimationEventAndPlay(animator, animationClipName, eventFunctionName, eventTime, YourCallback);
        }
 
        // 示例事件方法
        public void YourEventFunction()
        {
            Debug.Log("动画事件触发了!");
        }
 
        // 示例回调方法
        public void YourCallback()
        {
            Debug.Log("回调方法被调用!");
        }
    }

示例二


    using UnityEngine;
    using System;

    public static class AnimationUtils
    {
        /// <summary>
        /// 播放指定动画并添加动画事件,同时返回动画片段的时长。
        /// </summary>
        /// <param name="_animator">需要播放动画的 Animator 组件。</param>
        /// <param name="_clipName">目标动画片段的名称。</param>
        /// <param name="_functionName">当动画事件触发时调用的方法名称。</param>
        /// <param name="param">传递给事件方法的整数参数。</param>
        /// <param name="percent">事件触发时间的百分比(默认 1 表示动画结束时触发)。</param>
        /// <param name="callback">事件触发后的回调方法。</param>
        /// <returns>返回动画片段的时长;如果无效输入或未找到动画片段,返回 -1。</returns>
        public static float PlayAnim_AddEventAndGetDuration(Animator _animator, string _clipName, string _functionName, int param, float percent = 1, Action callback = null)
        {
            // 检查 Animator 和动画名称的有效性  
            if (_animator == null || string.IsNullOrEmpty(_clipName) || _animator.runtimeAnimatorController == null)
                return -1; // 返回 -1 表示无效输入  

            // 获取 Animator 的 RuntimeAnimatorController  
            RuntimeAnimatorController controller = _animator.runtimeAnimatorController;

            // 遍历所有动画片段  
            foreach (AnimationClip clip in controller.animationClips)
            {
                if (clip.name.Equals(_clipName, StringComparison.OrdinalIgnoreCase))
                {
                    // 创建并添加动画事件  
                    AnimationEvent aniEvent = new AnimationEvent
                    {
                        functionName = _functionName,
                        intParameter = param,
                        time = percent * clip.length
                    };
                    clip.AddEvent(aniEvent);

                    // 播放动画  
                    _animator.Play(_clipName);

                    // 调用回调函数(如果存在)  
                    callback?.Invoke();

                    return clip.length; // 返回动画片段的时长  
                }
            }

            return -1; // 如果未找到动画片段,返回 -1  
        }
    }

    public class AnimationEventExample : MonoBehaviour
    {
        public Animator animator; // 关联的 Animator 组件
        public string animationClipName = "YourAnimationClip"; // 动画片段名称
        public string eventFunctionName = "YourEventFunction"; // 事件方法名称
        public int eventParam = 0; // 传递给事件方法的参数
        public float eventPercent = 1.0f; // 事件触发时间的百分比

        void Start()
        {
            // 调用 PlayAnim_AddEventAndGetDuration 方法
            float duration = AnimationUtils.PlayAnim_AddEventAndGetDuration(animator, animationClipName, eventFunctionName, eventParam, eventPercent, YourCallback);
            Debug.Log($"动画片段 '{animationClipName}' 的时长为: {duration} 秒。");
        }

        // 示例事件方法
        public void YourEventFunction(int param)
        {
            Debug.Log($"动画事件触发了,参数: {param}");
        }

        // 示例回调方法
        public void YourCallback()
        {
            Debug.Log("回调方法被调用!");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值