void ShowCallbacks() { callbacksProperty = serializedObject.FindProperty("callbacks"); EditorGUI.BeginDisabledGroup(Application.isPlaying); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Callbacks", GUILayout.Width(75)); int callerMask = EditorGUILayout.MaskField(callbacksProperty.GetValue<int>(), callbacks); callbacksProperty.SetValue(callerMask); EditorGUILayout.EndHorizontal(); EditorGUI.EndDisabledGroup(); List<StateMachineCaller> callers = new List<StateMachineCaller>(); for (int i = 0; i < callbackTypes.Length; i++) { if ((callerMask & 1 << i) != 0) { StateMachineCaller caller = stateMachine.GetOrAddComponent(callbackTypes[i]) as StateMachineCaller; caller.machine = stateMachine; caller.hideFlags = HideFlags.HideInInspector; callers.Add(caller); } } for (int i = existingCallers.Length - 1; i >= 0; i--) { StateMachineCaller caller = existingCallers[i]; if (caller != null && !callers.Contains(caller)) { callers.Remove(caller); caller.Remove(); } } }
public static void UpdateCallbacks(StateMachine machine) { BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; int callerMask = 0; foreach (StateLayer layer in machine.GetComponents <StateLayer>()) { foreach (MethodInfo method in layer.GetType().GetMethods(flags)) { if (CallbackNames.Contains(method.Name)) { callerMask |= 1 << (Array.IndexOf(CallbackNames, method.Name) + 2); } } } foreach (State state in machine.GetComponents <State>()) { foreach (MethodInfo method in state.GetType().GetMethods(flags)) { if (CallbackNames.Contains(method.Name)) { callerMask |= 1 << (Array.IndexOf(CallbackNames, method.Name) + 2); } } } for (int i = 0; i < CallbackTypes.Length; i++) { if ((callerMask & 1 << i + 2) != 0) { StateMachineCaller caller = machine.GetOrAddComponent(CallbackTypes[i]) as StateMachineCaller; caller.machine = machine; } else { StateMachineCaller caller = machine.GetComponent(CallbackTypes[i]) as StateMachineCaller; if (caller != null) { caller.Remove(); } } } }