c# - Unity3d - 如何获取 Animator 的图层 --> 子状态 --> 状态名称哈希?

标签 c# unity3d

我正在使用以下结构:

(层)“基础层”--> (子状态) "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 的屏幕截图 Screenshot of my 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/

相关文章:

c# - 交换时,通过引用调用在 C# 中不起作用

c# - .NET 默认值属性

c# - 将游戏对象缓慢移动到鼠标位置

c# - Quaternion.Slerp 在没有 Y 轴的 X 和 Z 轴上

ios - 将 Swift 集成到导出的 Unity 项目中而不是使用 Objective C?

c# - 光标无法在场景切换 Unity 5 上移动

c# - 移动游戏对象的最佳方式是什么,而不是传送它?

c# - 公开自托管服务时以编程方式从配置文件中读取 WCF 行为元素

c# - 应用程序在 Dispatcher.Invoke 后卡住

c# - 将 Dictionary<Key, Value> 转换为 IReadOnlyDictionary<Key, IValue>?