ふうのUnity手帳

Unityに関することを書いていこうかと…(間違いがありましたらご指摘お願いいたします)

Animatorの現在state取得時のhashの違い

今回書くのは、nameHashfullPathHash の違いについてです。
nameHashを使っていてそれは古いよ~fullPathHashを変わりに使いなよってワーニングが出たので調べてみました。
興味の無い方、もうわかってるよって方はお戻りくださいませ

結論から言いますとSub-state Machineを使う場合には値が変わってきます。

Sub-state Machineを使わない場合には

stateinfo.nameHash == Animator.StringToHash("Base Layer.name")
stateinfo.fullPathHash == Animator.StringToHash("Base Layer.name")

のようにそれぞれのハッシュとレイヤー名.stateの名前のハッシュを比べます。

Sub-state Machineのハッシュを見る場合には

stateinfo.nameHash == Animator.StringToHash("Substate.name")
stateinfo.fullPathHash == Animator.StringToHash("Base Layer.Substate.name")

のようにそれぞれのハッシュと
nameHash の方はSub-state Machineの名前.stateの名前
fullPathHashレイヤー名.Sub-state Machineの名前.stateの名前
のハッシュを比べます

こちらhttp://unity-chan.com/download/releaseNote.php?id=UnityChanScriptPatch
を見る限り仕様変更のようですので後々nameHashの方は使えなくなるかもしれませんね。(公式の変更項目については目を通しておりません。すみません。)

最後にハッシュを確かめるために作ったスクリプトを貼っておきますね。

using UnityEngine;
using UnityEngine.UI;

public class anime : MonoBehaviour {
	[SerializeField]Text textobj;
	Animator ani;
	[SerializeField] string[] statename = new string [3] {"Base Layer.name","Substate.name","Base Layer.Substate.name"};
	[SerializeField] int element;

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

	void Update () {
		AnimatorStateInfo stateinfo = ani.GetCurrentAnimatorStateInfo(0);
		textobj.text =	"fullPathHash="+stateinfo.fullPathHash+
				"\nnameHash="+stateinfo.nameHash+
				"\nStringToHash"+Animator.StringToHash( statename[element] );
	}
}