LoginSignup
0
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-08

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

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

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

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

例えば、こんな感じ。

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 ファイルがあると思うので、そのパスを指定すればいい。

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

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

    /// <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 にしてみよう

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

    /// <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;
                        }
                    }
                }
            }
        }
    }

// 書きかけ

0
2
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
0
2