Edited at

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

More than 3 years have passed since last update.


要件

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