behaviour | 用于获取上下文的状态机行为。 |
StateMachineBehaviourContext[] 返回状态机行为版本上下文。
使用此函数可检索行为的所有者。
请注意,此函数的运行速度非常缓慢。不建议对每一帧都使用此函数。 另请参阅: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();
}
}