Unityで状態遷移を組むときに使うアニメーター・コントローラーを作成するC#スクリプトのソースコード

全記事を再構成中。３記事に分けて、ソースコードをこの記事に集めることにする。

アニメーター・コントローラーとは何か編：http://qiita.com/muzudho1/items/85cd11ba0c7b1b7d496d

アニメーター・コントローラーの何をC#スクリプトで作成できるか編：
http://qiita.com/muzudho1/items/f6d8a10d057307057b7f


# アニメーター・コントローラーを取得する方法

例えば、こんな感じ。

```C#
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;

/// <summary>
/// 開発中に使うメニュー
/// </summary>
public class ToolMenu {

    #region アニメーター・コントローラー編集

    /// <summary>
    /// アニメーター・コントローラーの編集
    /// </summary>
    [MenuItem("Tool/Animator Controller")]
    static void AnimatorController()
    {
        AnimatorController ac = AssetDatabase.LoadAssetAtPath<AnimatorController>("Assets/Resources/AnimatorControllers/AniCon@Char3.controller");
    }

    #endregion
}

```

Assetsフォルダーの下に 〇〇.controller ファイルがあると思うので、そのパスを指定すればいい。



#鈍臭いスキャン部分の抜粋

最初　何から組んだらいいのか分からないと思うんで、例えば次のような　全件走査とかどうだろうか。

```C#
    /// <summary>
    /// アニメーター・コントローラーの編集
    /// </summary>
    [MenuItem("Tool/Animator Controller")]
    static void AnimatorController()
    {
        AnimatorController ac = AssetDatabase.LoadAssetAtPath<AnimatorController>("Assets/Resources/AnimationClips/Player.controller");

        Debug.Log("パラメーター数 = " + ac.parameters.Length);
        foreach (AnimatorControllerParameter parameter in ac.parameters) {Debug.Log("引数 = " + parameter.name);}


        Debug.Log("レイヤー数 = " + ac.layers.Length);
        foreach (AnimatorControllerLayer layer in ac.layers)//レイヤー
        {
            Debug.Log("レイヤー = "+ layer.name);

            foreach (ChildAnimatorStateMachine stateMachine_wrapper in layer.stateMachine.stateMachines)//ステートマシン
            {
                AnimatorStateMachine stateMachine = stateMachine_wrapper.stateMachine;
                Debug.Log("ステートマシン = " + stateMachine.name + " ステート数 = " + stateMachine.states.Length);

                foreach (ChildAnimatorState state_wrapper in stateMachine.states)//ステート
                {
                    AnimatorState state = state_wrapper.state;
                    Debug.Log("ステート = " + state.name + " トランジション数 = " + state.transitions.Length);

                    foreach (AnimatorStateTransition transition in state.transitions)//トランジション
                    {
                        if (null != transition.destinationState)
                        {
                            Debug.Log("遷移先 = " + transition.destinationState.name);
                        }
                        else
                        {
                            Debug.Log("遷移先なし");
                        }
                    }
                }
            }
        }
    }
```

GUIで見ると　ステートマシンは　ツリー構造のような見た目をしているが、フラットに格納されている。

# 全てのステートの exitTime を 0 にしてみよう

アンドゥ期待できないんで、データのバックアップを取っておいてから試そう。

```C#
    /// <summary>
    /// アニメーター・コントローラーの編集
    /// </summary>
    [MenuItem("Tool/Animator Controller")]
    static void AnimatorController()
    {
        AnimatorController ac = AssetDatabase.LoadAssetAtPath<AnimatorController>("Assets/Resources/AnimationClips/Player.controller");

        foreach (AnimatorControllerLayer layer in ac.layers)//レイヤー
        {
            foreach (ChildAnimatorStateMachine stateMachine_wrapper in layer.stateMachine.stateMachines)//ステートマシン
            {
                AnimatorStateMachine stateMachine = stateMachine_wrapper.stateMachine;

                foreach (ChildAnimatorState state_wrapper in stateMachine.states)//ステート
                {
                    AnimatorState state = state_wrapper.state;

                    foreach (AnimatorStateTransition transition in state.transitions)//トランジション
                    {
                        if (0!= transition.exitTime)
                        {
                            Debug.Log("遷移先 " + (null != transition.destinationState ? transition.destinationState.name : "なし") + " のトランジションの exitTime = " + transition.exitTime + " を 0 にします");
                            transition.exitTime = 0;
                        }
                    }
                }
            }
        }
    }
```

// 書きかけ