以下のコードは 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以前ではこの方法は使えないようです。