2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Organization

【Unity】Animatorからステート(AnimatorState)の一覧を取得する

バージョン

Unity 2019.4.13f1

はじめに

Unity で Mecanim のチェックをするのにこういうのを作りたいと思いました。
animator.png
goal.png

一応、アニメーションクリップのインスペクタの下側で Animator の付いたモデルをぶち込めばモーション単体のチェックはできます(画像参照)が、
いずれレイヤーのブレンドやらアバターマスクやら IK やらを含めて確認したくなるだろうことを考えると、やっぱりシーン上で見たいなぁとなります。
clip_preview.png

さて実現方法ですが、各ステート間の遷移は CrossFade(もしくは CrossFadeInFixedTime)でやればいいとして、問題は「あらかじめ全てのステート名を知っていなければならない」ことです。
Animator ウインドウを眺めながら手作業でステート名を入力してもいいのですが、どう考えても面倒…。

そこで、今回は Animator から全てのステートを取得することはできないのか?というお話。

方法

結論から言うとエディタでなら可能でした。

そもそも Animator クラスに AnimatorController 型のプロパティがないなぁ…と思ってたんですが、AnimatorController クラスは UnityEditor 名前空間の所属になっており、アセットとして扱うためのクラスのようです。

代わりっぽいもので RuntimeAnimatorController 型の runtimeAnimatorController とかいうプロパティがありますが、リファレンスを見る限りこいつからはステート情報には辿り着けなさそうに思えます。

で、色々調べていたところ、まさにやりたいことをやっている方がおられました。

なるほど、RuntimeAnimatorController を AnimatorController にキャストできたんですね…。1
で、そこから layers でレイヤーを取得し、stateMachine → states とたどれば望みのステート情報が取得できると。

ということで、前述の方が掲載しているソースを参考に自分用にカスタマイズしてこんな感じになりました。

ソースコード(gist)

result.gif

注意点

前述した通り、AnimatorController が UnityEditor 名前空間にあるので残念ながらビルドでは使えません。
とはいえチェックなどの用途で、エディタ上に限られていても役に立つ場面はあるかなと思います。

なお、ビルドでも実現する案としては、あらかじめ上の手段でステート情報を取って、SerializeField として埋め込んでおくなどの工夫でいけそうです。
ですが、それはまた別の機会に…。

クレジット

本記事のキャプチャイメージでは下記の素材を使わせて頂きました。


  1. よくリファレンス見ると AnimatorController が RuntimeAnimatorController を継承しているじゃん…。ということで普通の(?)ダウンキャストになりますね。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?