Version: 5.4

AnimatorController.FindStateMachineBehaviourContext

マニュアルに切り替える
public static StateMachineBehaviourContext[] FindStateMachineBehaviourContext (StateMachineBehaviour behaviour);

パラメーター

behaviour State Machine Behaviour でコンテキストを取得します。

戻り値

StateMachineBehaviourContext[] State Machine Behaviour コンテキストの版を返します。

説明

この振る舞い(動作)のオーナーを検索するために、この機能を使用します。

この関数は非常に動作が遅いため、毎フレーム使用することは推奨しません。 See Also: StateMachineBehaviourContext.

using UnityEngine;
using UnityEditor;

public class IdleBehaviour : StateMachineBehaviour { public int transitionCount; protected int randomTransitionId = Animator.StringToHash("random");

// OnStateEnter is called when a transition starts and the state machine starts to evaluate the state override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { }

// OnStateUpdate is called at each engine tick between OnStateEnter and OnStateExit callback override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if(stateInfo.normalizedTime > 0.5f) animator.SetInteger(randomTransitionId, Random.Range(0, transitionCount) ); }

// OnStateExit is called when a transition ends and the state machine ends to evaluate the state override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { } }

[CustomEditor(typeof(IdleBehaviour), true)] public class IdleBehaviourEditor : Editor { UnityEditor.Animations.StateMachineBehaviourContext[] context;

SerializedProperty transitionCount;

public void OnEnable() { context = UnityEditor.Animations.AnimatorController.FindStateMachineBehaviourContext(target as StateMachineBehaviour); if(context != null) { // animatorObject can be an AnimatorState or AnimatorStateMachine UnityEditor.Animations.AnimatorState state = context[0].animatorObject as UnityEditor.Animations.AnimatorState; if (state != null) { IdleBehaviour behaviour = target as IdleBehaviour; behaviour.transitionCount = state.transitions.Length; } }

transitionCount = serializedObject.FindProperty("transitionCount"); }

public override void OnInspectorGUI() { serializedObject.Update();

EditorGUI.BeginDisabledGroup(true); EditorGUILayout.PropertyField(transitionCount); EditorGUI.EndDisabledGroup();

serializedObject.ApplyModifiedProperties();

} }