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


要件

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

AnimatorOverrideControllerを使ってみる

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

問題点

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

スクリプトで制御する

動的に 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 を有効に使えば簡単に実装できるのか・・・?