Version: 2018.1

AnimatorController.FindStateMachineBehaviourContext

Switch to Manual
public static StateMachineBehaviourContext[] FindStateMachineBehaviourContext (StateMachineBehaviour behaviour);

Parameters

behaviourThe State Machine Behaviour to get context for.

Returns

StateMachineBehaviourContext[] Returns the State Machine Behaviour edition context.

Description

Use this function to retrieve the owner of this behaviour.

Please note that this function is very slow. It is not recommended to use this function every frame. 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(); } }
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961