バージョン
Unity 2019.4.13f1
はじめに
Unity で Mecanim のチェックをするのにこういうのを作りたいと思いました。
一応、アニメーションクリップのインスペクタの下側で Animator の付いたモデルをぶち込めばモーション単体のチェックはできます(画像参照)が、
いずれレイヤーのブレンドやらアバターマスクやら IK やらを含めて確認したくなるだろうことを考えると、やっぱりシーン上で見たいなぁとなります。
さて実現方法ですが、各ステート間の遷移は CrossFade(もしくは CrossFadeInFixedTime)でやればいいとして、問題は「あらかじめ全てのステート名を知っていなければならない」ことです。
Animator ウインドウを眺めながら手作業でステート名を入力してもいいのですが、どう考えても面倒…。
そこで、今回は **Animator から全てのステートを取得することはできないのか?**というお話。
方法
結論から言うとエディタでなら可能でした。
そもそも Animator クラスに AnimatorController 型のプロパティがないなぁ…と思ってたんですが、AnimatorController クラスは UnityEditor 名前空間の所属になっており、アセットとして扱うためのクラスのようです。
代わりっぽいもので RuntimeAnimatorController 型の runtimeAnimatorController とかいうプロパティがありますが、リファレンスを見る限りこいつからはステート情報には辿り着けなさそうに思えます。
で、色々調べていたところ、まさにやりたいことをやっている方がおられました。
なるほど、RuntimeAnimatorController を AnimatorController にキャストできたんですね…。1
で、そこから layers でレイヤーを取得し、stateMachine → states とたどれば望みのステート情報が取得できると。
ということで、前述の方が掲載しているソースを参考に自分用にカスタマイズしてこんな感じになりました。
注意点
前述した通り、AnimatorController が UnityEditor 名前空間にあるので残念ながらビルドでは使えません。
とはいえチェックなどの用途で、エディタ上に限られていても役に立つ場面はあるかなと思います。
なお、ビルドでも実現する案としては、あらかじめ上の手段でステート情報を取って、SerializeField として埋め込んでおくなどの工夫でいけそうです。
ですが、それはまた別の機会に…。
クレジット
本記事のキャプチャイメージでは下記の素材を使わせて頂きました。
-
よくリファレンス見ると AnimatorController が RuntimeAnimatorController を継承しているじゃん…。ということで普通の(?)ダウンキャストになりますね。 ↩