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;
}
}