Unity3d-如何获取Animator的图层->子状态->状态namehash?

JoR*_*uss 2 c# unity-game-engine

我正在使用以下结构:

(层)“基础层”->(子状态)“ Jump_Fall_Roll”->(状态)“ Roll”

static int rollState = Animator.StringToHash("What to put here??");

private Animator anim;
private AnimatorStateInfo currentBaseState;

void Start ()
{
    anim = GetComponent<Animator>();
}

void FixedUpdate ()
{
    currentBaseState = anim.GetCurrentAnimatorStateInfo(0);

    if (currentBaseState.nameHash == rollState) {
        Debug.Log ("ROLL nameHash worked"); //Not working
    }
    if (currentBaseState.IsName("Roll")) {
        Debug.Log ("ROLL IsName worked"); //Working.......
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了每个可能的父母/州的组合来使用nameHash,但从未成功过……

名称应采用Layer.Name形式,例如“ Base.Idle”。

来自Unity的AnimatorStateInfo.IsName文档

那么,为什么我的第一个案例不起作用?第二种情况如何工作?

我真的很困惑

编辑

我的Animator视图的屏幕截图 我的Animator视图的屏幕截图

我确实尝试过 static int rollState = Animator.StringToHash("Base Layer.Roll");

然后 Debug.Log (currentBaseState.nameHash + ", " + rollState);

将输出

1094782407,-1476868190

当我处于滚动状态时。rollState永远不会= currentBaseState.nameHash。

我确实在Idle状态下进行了测试,它的工作原理如下:

static int rollState = Animator.StringToHash("Base Layer.Idle");

我看不到子状态的结构,真令人沮丧。

use*_*911 5

在撰写本文时,在最新的5.3.4版本中,可以部分回答以下问题。

首先,没有nameHash更多了。最接近的变量是shortNameHash。建议改为使用fullPathHash,稍后将对此进行说明。shortNameHash就像OS中的裸文件名一样,而fullPathHash顾名思义,它包含图层名称作为状态名称之前的路径。这是一个使用它们两者来标识当前状态的示例:

int baseState = Animator.StringToHash("Base Layer.Idle");
int short_baseState = Animator.StringToHash("Idle");
int subState = Animator.StringToHash("Base Layer.Jump_Fall_Roll.Roll");
int short_subState = Animator.StringToHash("Roll");

...

AnimatorStateInfo s = myAnimator.GetCurrentAnimatorStateInfo(0);
Debug.Log(s.fullPathHash + ", " + baseState);   //they are equal at Idle state in base layer
Debug.Log(s.shortNameHash + ", " + short_baseState);   //they are equal at Idle state in base layer
Debug.Log(s.fullPathHash + ", " + subState);   //they are equal at Roll state in sub-state machine
Debug.Log(s.shortNameHash + ", " + short_subState);   //they are equal at Roll state in sub-state machine
Run Code Online (Sandbox Code Playgroud)

从上面的示例可以看出,shortNameHash无论状态是基础层中的常规状态还是子状态机中的状态,该状态都适用于裸状态名称。但是fullPathHash仅当图层路径在状态名称之前正确加上前缀时才有效。如果我们确定在不同的状态机中没有重复的状态名,那shortNameHash是好的,因为它很短,但是这种假设并不总是适用于大型复杂的动画师控制器,因此我建议您一直使用fullPathHash

我将此答案称为“部分”,因为我们必须确保传递给GetCurrentAnimatorStateInfo的层ID为0,即,“当前工作层”(如pwdlinux中的命令)应为基础层。如果我们将1传递给上面的路径名约定,它将失败。我没有时间猜测第1层中的路径名应该是什么。