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