Exemple #1
0
        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();
                    }
                }
            }
        }