23
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Mecanimに設定しているアニメーションクリップを動的に差し替える

Last updated at Posted at 2015-06-02

要件

Mecanim で制御しているキャラクターの AnimationClip を動的に変更したい。
変更したい箇所は複数存在し、各種10種類以上あることが予想される。
ステートマシンは使いたいので LegacyAnimation を使う選択肢はない。

AnimatorOverrideControllerを使ってみる

AnimatorOverrideController を差し替えたいClipの分作成する。
override.png

問題点

変更箇所の組み合わせが複雑になると正直全部作ってられない。
どちらにしろ分岐かかなきゃいけないし、そもそも管理しきれない。

スクリプトで制御する

動的に AnimatorOverrideController を作成して、
必要な個所だけ差し替えたものをアタッチしなおす。

// 新しいOverrideControllerを作成する
AnimatorOverrideController newAnime = new AnimatorOverrideController();

// 上書きしたいAnimatorを代入
newAnime.runtimeAnimatorController = GetComponent<Animator>().runtimeAnimatorController;

// ClipPairの差し替えたいクリップに対して処理を施す
AnimationClipPair[] clipPairs = newAnime.clips;
for( int i = 0; i < newAnime.clips.Length; i++ )
{
  // 今回はオリジナルクリップを名前で判別して差し替える
  if( newAnime.clips[i].originalClip.name.IndexOf("DamageAnim") >= 0 )
  {
    clipPairs[i].overrideClip = newClip; // newClipはInspector側でアタッチしてる前提
  }
}
newAnime.clips = clipPairs;

// 差し替えたOverrideControllerをAnimatorに代入して完了
GetComponent<Animator>().runtimeAnimatorController = newAnime;

必要な AnimationClip のみを動的にロードして、上書きできるので無駄が少ない。

他の方法はあるのか

そもそもこのやり方としてあってるのか謎・・・。
StateMachineBehaviour を有効に使えば簡単に実装できるのか・・・?

23
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?