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视图的屏幕截图

我确实尝试过 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");
我看不到子状态的结构,真令人沮丧。
在撰写本文时,在最新的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层中的路径名应该是什么。