Unity C# で Instantiate で動的に作成したオブジェクトにAnimatorController を割り当てる方法がわからずに、長時間沼ったので記事にしたいと思います。
ネットで調べたり ChatGPT も尋ねてもわからず、基本過ぎてあえて説明するまでもないという事でしょうか。
Unityでアニメーションする流れ
- アニメーションウィンドウでアニメーションを作成
- アニメーションコントローラーの設定
- オブジェクトに Animator をアタッチ
- スクリプトでアニメーション再生
アニメーションは基本的にこのような流れとなります。
シーン上に配置しているオブジェクトならこれで問題ありません。しかし、動的配置した場合 Animator がアタッチできません。
Animator animator = obj.AddComponent<Animator>(); animator.Play("testAnimation");
これに関しては addComponent で Animator をアタッチできました。
しかし、以下のようなエラーが出てしまいます。
AnimatorController が割り当てられていないため、アニメーションが再生できないというエラーです。
問題は Animator はアタッチされていますが、AnimatorController は割り当てられていないという点です。
ではどうやって、割り当てるの?
色々調べると2つの方法が見つかりました。
- Resources.Load を使う
- アセットバンドルを使う
Resources.Load は Assets フォルダーに Resources フォルダーがないと使えませんし、現在は非推奨のようです。
アセットバンドルは非常にめんどくさそう…。
スクリプトからアニメーションを再生というよく使われそうな事なのに、こんなにも大変でしょうか?
そんな事はありませんでした。
AnimatorControllerをスクリプトから割り当てる
理解すればものすごく単純な話でした。
クラスの最初にアニメーターコントローラーの変数を定義します。
[SerializeField] RuntimeAnimatorController animationController;
するとインスペクター上からアニメーターコントローラーを割り当てられるではありませんか。
アニメーターコントローラーをここにドラッグアンドドロップしてください。
Animator animator = obj.AddComponent<Animator>(); animator.runtimeAnimatorController = animationController; animator.Play("testAnimation");
このようにすると、動的配置したオブジェクトをアニメーションさせる事ができました。