AnimatorStateInfo 中 nameHash 值

AnimatorStateInfo.IsName(sting name) 这个方法是用来判断当前 Animator 播放的否是某个动画,而这个方法不只是比对动画名称的 nameHash 值,通过测试我们会发现传入纯粹的动画状态名称或者传入状态所在层名称和状态名称的组合,都是可以成功匹配的。

AnimatorStateInfo.IsName(string name) 方法不仅会比对这个 FullPath Name,还会比对 Simple Name,例如我们在 Base Layer 中有一个名为 Idle 的状态。

那么通过 AnimatorStateInfo.IsName(“Idle”) 和 AnimatorStateInfo.IsName(“Base Layer.Idle”) 都是 True,但是如果我们要直接比对 nameHash 的值,那就必须使用 Animator.StringToHash(“Base Layer.Idle”) 和 AnimatorStateInfo 的 nameHash 属性值进行比对,而不能使用简称的 nameHash 值 Animator.StringToHash(“Idle”) 来进行比对。

在 Unity4.6 中 AnimatorStateInfo 中得 nameHash 属性值是通过 Animator.StringToHash(“Base Layer.StateName”) 获得的,参数是全路径名,全路径由状态所在层名称和动画状态名称组成,格式为 “[LayerName].[StateName]”,请自行使用对应的 LayerName 和 StateName 替换方括号中的内容。


升级到 Unity5 之后,AnimatorStateInfo 中就木有 nameHash 这个属性了,不过新增了两个字面意思更明确的属性,shortNameHash 和 fullPathName,两者的区别就是 fullPathHash 传入的 Name 参数是带上 State 所在的 Layer 的名字的,例如:Base Layer.Idle,而 shortNameHash 就是不带 Layer 名字的,例如:Idle。这样更明确了显然是更好的,看到 Unity3D 的文档一天天往完善了发展,还是深感幸福啊。