LoginSignup
20
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-01-31

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

20
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16