AnimatorControllerをスクリプトから編集するアレコレ

  • 7
    いいね
  • 0
    コメント

以下のコードは using UnityEditor.Animations していることを前提としています。また、Unity5.2.2で動作を確認しています。

AnimationControllerを開く

エディタの場合、AssetDatabaseを使って .controller ファイルを読み込み、AnimatorController にキャストします。
ランタイムの時は Resources.Load などの各種ロード手段で代替して下さい。

RuntimeAnimatorController asset = AssetDatabase.LoadAssetAtPath<RuntimeAnimatorController>(path);
AnimatorController controller = asset as AnimatorController;

レイヤーを取得する

controller.layers.Length でレイヤー総数を、controller.layers の配列からレイヤーを取得出来ます。

for (int i=0; i<controller.layers.Length; ++i) {
    AnimatorControllerLayer layer = controller.layers[i];
    // レイヤーに対して処理する
}

ステートを取得する

レイヤーから AnimatorStateMachine を取得し、stateMachine.states でステートの一覧を取得出来ます。

AnimatorStateMachine stateMachine = layer.stateMachine;
foreach (var state in stateMachine.states) {
    AnimatorState animState = state.state;
    Debug.Log("ステート名=" + animState.name);
    // ステートに対して処理する
}

アニメーションクリップの参照

ステートのアニメーションクリップを参照出来ます。
別途読み込んだクリップをセットすることも可能です。

AnimationClip animationClip = AssetDatabase.LoadAssetAtPath<AnimationClip>(clipPath);
animState.motion = animationClip;

変更を保存する

metaファイルを書き換えずに上書き保存したいところですが、AnimatorControllerは構造が複雑なため、なかなかうまく行きません。最終的には以下の方法でうまく行くようになりました。

EditorApplication.SaveAssets();     // 変更を保存する
FileUtil.ReplaceFile(srcControllerPath, dstControllerPath); // コントローラを上書きする
AssetDatabase.Refresh();        // 変更を反映する

ただし、Unity5.1以前ではこの方法は使えないようです。