废话不多说,直接粘贴代码
private string GetAnimatorStateName()
{
if (m_ShowAnimator.runtimeAnimatorController is AnimatorController at)
{
var stateMachine = at.layers[0].stateMachine;
foreach (var animState in stateMachine.states)
{
if (animState.state.nameHash == m_ShowAnimator.GetCurrentAnimatorStateInfo(0).shortNameHash)
{
return animState.state.name;
}
}
}
return "";
}
需要引入命名空间using UnityEditor.Animations;
指定好m_ShowAnimator就能直接调用此方法了,只能在编辑器模式下运行,打包如果包含此部分逻辑会报错
建议将所有状态名在编辑器模式下运行,存为一个json文件,在打包之后,再读取json文件
这里给出存取的代码,这里需要声明private List<string> m_AnimStateList = new List<string>();
public void ReadAnimStateJson()
{
string jsonString = File.ReadAllText(Application.streamingAssetsPath + "/AnimData.json");
m_AnimStateList = JsonConvert.DeserializeObject<List<string>>(jsonString);
}
public void WriteAnimationList()
{
if (m_ShowAnimator.runtimeAnimatorController is AnimatorController at)
{
var stateMachine = at.layers[0].stateMachine;
for (int i = 0; i < stateMachine.states.Length; i++)
{
string animName = stateMachine.states[i].state.name;
m_AnimStateList.Add(animName);
}
}
string jsonString = JsonConvert.SerializeObject(m_AnimStateList);
File.WriteAllText(Application.streamingAssetsPath + "/AnimData.json", jsonString);
}
为什么不使用传统的Animator去实现,要搞得这么复杂?
传统的Animator组件,获取当前播放动画的方法为
查看这个数据结构可知,里面没有一个string的变量,只有一个几个哈希过的名称的int类型(网上铺天盖地都是用这个IsName,,,我要是知道name是啥我还去获取?)
通过查阅资料得知这个hash值来自这个方法计算得出
但是要知道哈希是不可逆的,所以直接通过animator的原生方法,不可能得到动画状态state的名称,不知道有没有其他方法,反正暂时我没想到怎么处理这个哈希值
于是使用UnityEditor下获取这个state名称,很有可能这个state只是编辑器模式下的东西,所以为了build之后能取到,只能提前存起来,具体存取,以及原理,请参考上方代码