获取当前动画状态的名称

时间:2016-01-18 02:15:24

标签: c# unity3d

如何在Animator组件的图层中获取当前状态的名称?我意识到我可以将名称与GetCurrentAnimatorStateInfo(0).IsName("statename")进行比较,但我不想为我的图层中的每个州运行该名称。是否可以简单地获取当前状态的名称?

5 个答案:

答案 0 :(得分:5)

我不认为这是可能的。我能想到的唯一好方法是使用switch语句和nameHash这样:

Animator animator = GetComponent<Animator>();

// Get the id of all state for this object
int runId = Animator.StringToHash("Run");
int jumpId = Animator.StringToHash("Jump");

AnimatorStateInfo animStateInfo = animator.GetCurrentAnimatorStateInfo(0);

switch (animStateInfo.nameHash)
{
    case runId:
        Debug.Log("Current state is Run");
        break;
    case jumpId:
        Debug.Log("Current state is Jump");
        break;
    default:
        Debug.Log("Current state is not in this list");
        break;
}

答案 1 :(得分:0)

资产商店中有一个插件,可让您访问当前的州名称。它还可以用于使用自定义参数触发Animator状态上的事件,在场景中预览动画状态,更轻松地过滤状态等等!

这是链接: https://www.assetstore.unity3d.com/#!/content/115408

答案 2 :(得分:0)

我们可以使用以下代码获取当前播放片段的名称

private Animator animator = GetComponent<Animator>();
private AnimatorClipInfo[] clipInfo;

public string GetCurrentClipName(){
    clipInfo = animator.GetCurrentAnimatorClipInfo(0);
    return clipInfo[0].clip.name;
}

注意:此代码已在统一版本2018.3中经过测试,因此我不确定该代码是否适用于先前版本。

答案 3 :(得分:0)

使用 AnimatorStateInfo.IsName(string name)

AnimatorStateInfo asi = GetComponent<Animator>().GetCurrentAnimatorStateInfo(0);
if(asi.IsName("Animation State Name"))
{
    // Playing "Animation State Name" now.
}

答案 4 :(得分:0)

现在让我告诉你:这是不可能的。看到您打开的数百个标签了吗?他们都没有答案,因为你无法得到一个州的名字。期间。

但一切都没有丢失,开发人员,你很精明。您知道有一些解决方法。

AnimationClip[] clips = anim.runtimeAnimatorController.animationClips; //this gets all your clips in your animator. ALL.
for (int i = 0; i < clips.Length; i++){
    print(clips[i].name); //you should create a list to store all of these.
}
Animator _aci = GetComponent<Animator>().GetCurrentAnimatorClipInfo(0);
List<theClassYouMadeForYourList> theListYouMade = new List <theClassYouMadeForYourList>(); //make sure you make a class for your list "theClassYouMadeForYourList"
for(int i = 0; i < theListYouMade.Count; i++){
    if(theListYouMade[i] == _aci[0].clip.name){//is the list item equal to the current clip name? Then do something
        print("doing something");
        break;
    }
}

我还没有测试过这个,但它应该可以工作。 ;)