You need to enable JavaScript to run this app. Unity中触发shoot触发器动画重复播放2次的问题及解决方案
优惠活动
大模型
产品
解决方案
定价
更多

Unity中触发shoot触发器动画重复播放2次的问题及解决方案

Unity Animator trigger触发动画重复播放问题修复

问题描述

使用Unity 2020.3.0f1版本开发时,Animator组件配置了触发名为shoot的trigger参数时播放对应射击动画的逻辑,触发后出现动画重复播放2次的异常。调整Transition duration(过渡时长)参数后,要么出现动画完全不播放的问题,要么仍然保持重复播放两次的问题。

修复方案

可通过Animator.GetCurrentClipInfo接口检测目标动画是否正在运行,仅在动画未运行的状态下触发trigger参数即可避免重复播放问题,参考实现代码如下:

using UnityEngine;

public class ShootAnimController : MonoBehaviour
{
    // 绑定对应Animator组件
    public Animator roleAnimator;
    // 射击动画片段的实际名称,与Animator窗口配置保持一致
    [SerializeField] private string shootClipName = "Shoot";
    // 射击动画所在的动画层索引,默认第一层为0
    [SerializeField] private int animLayerIndex = 0;

    public void PlayShootAnim()
    {
        bool isShootAnimRunning = false;
        // 获取当前层正在播放的所有动画片段信息
        AnimatorClipInfo[] currentClips = roleAnimator.GetCurrentAnimatorClipInfo(animLayerIndex);
        
        foreach (AnimatorClipInfo clipInfo in currentClips)
        {
            if (clipInfo.clip.name == shootClipName)
            {
                isShootAnimRunning = true;
                break;
            }
        }

        // 仅当射击动画未播放时触发trigger
        if (!isShootAnimRunning)
        {
            roleAnimator.SetTrigger("shoot");
        }
    }
}

注意事项

  • 无需修改原有Transition duration配置即可适配
  • 若射击动画配置了前置过渡动画,可额外调用GetNextAnimatorClipInfo接口检测待播放队列中是否已存在射击动画,避免重复入队
  • 动画片段名称、动画层索引需要和项目内Animator的实际配置完全匹配

内容的提问来源于stack exchange,提问作者Artemiy Mak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 09:15:01