Unity 获取当前播放的动画,判断是否是某个动画

cs 复制代码
第一种:
    Animator anim  = this.transform.GetComponent<Animator>();
    anim.GetCurrentAnimatorStateInfo(0).IsName("Att");//输入要判断的动画片段名字

注意:这种有一个很严重的问题,如果是动画树,或者一个动画下面有多个动画片段,会判断失败

第二种

cs 复制代码
public class GetCurrentAnimationTest : MonoBehaviour
    {
        // 拖拽赋值你的Animator组件
    public Animator anim;

    // 【第一步:手动替换成你自己的动画名】
    // 比如你要检测的动画名是"Att",就写这个字符串
    private string targetAnimName = "Att";
    // 动画名对应的Hash值(程序启动时自动计算)
    private int targetAnimHash;

    void Start()
    {
        // 自动获取Animator组件(如果没拖拽赋值)
        if (anim == null)
        {
            anim = GetComponent<Animator>();
        }

        // 计算目标动画的Hash值(全版本支持)
        targetAnimHash = Animator.StringToHash("Att");
    }

    void Update()
    {
        // 按下空格键,立即打印当前播放的动画信息
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // 获取当前真正播放的动画Hash值
            int currentAnimHash = GetCurrentPlayingAnimHash(0); // 0 = Base Layer
            
            // 1. 判断是否是目标动画(Att)
            bool isPlayingTarget = currentAnimHash == targetAnimHash;
            
            // 2. 打印核心信息(Hash值 + 是否是目标动画)
            Debug.Log($"当前播放的动画Hash:{currentAnimHash}");
            Debug.Log($"是否正在播放【{targetAnimName}】:{isPlayingTarget}");
            
            // 【可选】如果你非要看到字符串名称(辅助排查)
            Debug.Log("=== 辅助排查:当前层所有状态Hash对照 ===");
            Debug.Log($"{targetAnimName} 的Hash值:{targetAnimHash}");
            Debug.Log("Idle动画的Hash值(示例):" + Animator.StringToHash("Idle"));
            Debug.Log("Walk动画的Hash值(示例):" + Animator.StringToHash("Walk"));
        }
    }

    /// <summary>
    /// 获取指定层当前正在播放的动画Hash值(排除过渡状态)
    /// </summary>
    /// <param name="layerIndex">动画层索引(Base Layer=0)</param>
    /// <returns>当前播放动画的Hash值</returns>
    private int GetCurrentPlayingAnimHash(int layerIndex)
    {
        if (anim == null) return 0;

        // 关键:先判断是否在动画过渡中
        if (anim.IsInTransition(layerIndex))
        {
            // 过渡时,取「即将播放」的动画Hash(真正要播放的)
            return anim.GetNextAnimatorStateInfo(layerIndex).fullPathHash;
        }
        else
        {
            // 非过渡时,取「当前播放」的动画Hash
            return anim.GetCurrentAnimatorStateInfo(layerIndex).fullPathHash;
        }
    }

    // 【拓展方法】如果你需要批量判断多个动画,可加这个方法
    public bool IsPlayingAnim(int layerIndex, string animName)
    {
        int animHash = Animator.StringToHash(animName);
        return GetCurrentPlayingAnimHash(layerIndex) == animHash;
    }
    }
相关推荐
辻弋2014 天前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
Martina_03214 天前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
小贺儿开发4 天前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页
WarPigs6 天前
Unity对象不应该使用null传播的问题
unity
每日出拳老爷子7 天前
【VR】【Unity】抓走转放系列21|一天搭完门和抽屉工具槽:小场景按这个次序拼装
unity·vr·驱动·排错·snap zone
淡海水8 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
小贺儿开发8 天前
Unity 文物新生 会讲故事的文物展墙
人工智能·科技·unity·ai·视频·互动·演示
淡海水8 天前
02-03-原理篇-大对象堆
unity·c#·游戏引擎·.net·gc
WarPigs9 天前
Unity在Create菜单添加创建自定义脚本模板选项
unity
郝学胜-神的一滴9 天前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建