我正在使用以下结构:
(层)“基础层”--> (子状态) "Jump_Fall_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.......
}
}
我为 nameHash 尝试了所有可能的父/状态组合,但它从未奏效...
The name should be in the form Layer.Name, for example "Base.Idle".
AnimatorStateInfo.IsName doc from Unity
那么,为什么我的第一个案例不起作用?第二种情况如何工作?
我真的很困惑。
编辑
我的 Animator View 的屏幕截图
我试过 static int rollState = Animator.StringToHash("Base Layer.Roll");
然后Debug.Log(currentBaseState.nameHash + ", "+ rollState);
会输出
1094782407, -1476868190
当我处于滚动状态时。 rollState NEVER = currentBaseState.nameHash.
我确实在 Idle 状态下测试了这个,它像这样完美地工作:
static int rollState = Animator.StringToHash("Base Layer.Idle");
我看不到子状态的结构,真令人沮丧。
最佳答案
在撰写本文时的最新版本 5.3.4 中,问题可以部分回答如下。
首先,不再有nameHash
。最接近它的变量是 shortNameHash
。建议改用 fullPathHash
,稍后将对此进行说明。 shortNameHash
就像操作系统中的裸文件名,而 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
从上面的例子我们可以看出,shortNameHash
适用于裸状态名称,无论状态是基础层中的常规状态,还是子状态机中的状态。但是 fullPathHash
仅在层路径在状态名称之前正确添加前缀时才有效。如果我们确定在不同的状态机中没有重复的状态名称,shortNameHash
是好的,因为它很短,但这个假设并不总是适用于大型复杂的动画 Controller ,所以我想推荐始终使用 fullPathHash
。
我称这个答案为“部分”,因为我们必须确保传递给 GetCurrentAnimatorStateInfo 的层 ID 为 0,即“当前工作层”(如 linux 中的 pwd
命令)应该是基础层。如果我们将 1 传递给它,上述路径名约定将失败。我没有时间猜测第 1 层中的路径名应该是什么。欢迎在这方面进行任何补充。
关于c# - Unity3d - 如何获取 Animator 的图层 --> 子状态 --> 状态名称哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22956518/