1

現在開いているアニメーション コントローラにアクセスし、アニメーション トランジションを破棄/作成/変更するエディタ メニュー項目を作成したいと考えています。

基本的に、現在開いているアニメーター コントローラーのすべてのアニメーション状態/クリップを反復処理し、それらの名前に基づいて特定のトランジションを作成し、すべてのクリップの再生速度を調整する必要があります。

私はこのコードスニペットを持っています:

        UnityEditorInternal.AnimatorController ac = GetComponent<Animator>().runtimeAnimatorController as UnityEditorInternal.AnimatorController;
        int numLayers = ac.layerCount;

        for(int i = 0; i<numLayers; i++){
            UnityEditorInternal.AnimatorControllerLayer layer = ac.GetLayer(i);
            Debug.Log ("Layer " + i + " is: " + layer.name + " and has " + layer.stateMachine.stateCount + " states");
            UnityEditorInternal.StateMachine sm = layer.stateMachine;
            for(int n = 0; n<sm.stateCount; n++){
                UnityEditorInternal.State state = sm.GetState(n);
                Debug.Log ("State " + state.name + " is " + state.GetHashCode());
                UnityEditorInternal.Transition[] list = sm.GetTransitionsFromState(state);
                for(int j = 0; j<list.Length; j++){
                    UnityEditorInternal.Transition transition = list[j];
                    Debug.Log ("Transition: " + transition.name + " is " + transition.GetHashCode());
                }
            }
        }

ただし、Unity5 (Unity 4 用に作成された可能性が最も高い) ではコンパイルされず、Unity 5 関数を使用して現在開いている AnimatorController を取得する方法がわかりません。

アニメーターコントローラークラスは として定義されているようですUnityEditor.Animations.AnimatorControllerが、現在開いているものを取得する方法がわかりません。

何かアドバイス?

4

3 に答える 3

3

あなたの答えのおかげで、私は次のことを思いつきました:

    Animator animator = GetComponent<Animator>();
    string assetPath = AssetDatabase.GetAssetPath(animator.runtimeAnimatorController);
    AnimatorController controller = AssetDatabase.LoadAssetAtPath<AnimatorController>(assetPath);

これは私のために働く!

于 2015-10-31T11:13:33.310 に答える
3

インスペクターのコンテキストメニューから AnimatorController にアクセスできました。これはあまり便利ではありませんが (コントローラー全体を処理するには、最初にプロジェクト ビューで選択する必要があるため)、機能します。

public class AnimImportTools: MonoBehaviour{
//.....

    [MenuItem("CONTEXT/AnimatorController/Make transitions immediate")]
    private static void makeTransitionsImmediate(){
        UnityEditor.Animations.AnimatorController ac = Selection.activeObject as UnityEditor.Animations.AnimatorController;
        foreach(var layer in ac.layers){
            foreach(var curState in layer.stateMachine.states){
                foreach(var transition in curState.state.transitions){
                    transition.duration = 0.0f;
                    transition.exitTime = 1.0f;
                }
            }
        }
    }
//.....
}

誰かがそれを行うためのより良い方法を知っている場合-つまり、よりアクセスしやすい場所にメニューを追加するか、メインメニューからこのスクリプトを実行します(そしてそこから現在開いているanimatorcontrollerを取得します)、私はすべて耳にします。

于 2015-03-28T10:38:53.263 に答える