protected override void OnInspectorDefaultGUI()
        {
            base.OnInspectorDefaultGUI();

            if (Targets.Length > 1)
            {
                EditorGUILayout.HelpBox("FSM cannot be multi-edited.", MessageType.None);
                return;
            }

            GUI.enabled = !EditorApplication.isPlaying;

            GUILayout.BeginHorizontal();
            EditorGUILayout.HelpBox("Finite state machine!", MessageType.Info);
            GUILayout.EndHorizontal();

            PropertyField(nameof(FSM.IsAutoRegister), "Auto Register");
            PropertyField(nameof(FSM.Name), "Name");
            PropertyField(nameof(FSM.Group), "Group");

            _stateList.DoLayoutList();

            GUILayout.BeginHorizontal();
            GUILayout.Label("Data", GUILayout.Width(LabelWidth));
            if (GUILayout.Button(Target.Data, EditorStyles.popup, GUILayout.Width(EditorGUIUtility.currentViewWidth - LabelWidth - 25)))
            {
                GenericMenu gm = new GenericMenu();
                gm.AddItem(new GUIContent("<None>"), Target.Data == "<None>", () =>
                {
                    Undo.RecordObject(target, "Set FSM Data Class");
                    Target.Data = "<None>";
                    HasChanged();
                });
                gm.AddItem(new GUIContent("<New Data Script>"), false, () =>
                {
                    EditorGlobalTools.CreateScriptFormTemplate(EditorPrefsTable.Script_FSMData_Folder, "FSMData", "FSMDataTemplate");
                });
                gm.AddSeparator("");
                List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type =>
                {
                    return(type.IsSubclassOf(typeof(FSMDataBase)) && !type.IsAbstract);
                });
                for (int i = 0; i < types.Count; i++)
                {
                    int j = i;
                    gm.AddItem(new GUIContent(types[j].FullName), Target.Data == types[j].FullName, () =>
                    {
                        Undo.RecordObject(target, "Set FSM Data Class");
                        Target.Data = types[j].FullName;
                        HasChanged();
                    });
                }
                gm.ShowAsContext();
            }
            GUILayout.EndHorizontal();

            GUI.enabled = true;

            OnArgsGUI();
        }
 private void NewSettingItemScript()
 {
     EditorGlobalTools.CreateScriptFormTemplate(EditorPrefsTable.Script_SettingItem_Folder, "SettingItem (EditorOnly)", "SettingItemTemplate");
 }
Example #3
0
 /// <summary>
 /// 新建任务点脚本
 /// </summary>
 private void NewTaskPointScript()
 {
     EditorGlobalTools.CreateScriptFormTemplate(EditorPrefsTable.Script_TaskPoint_Folder, "TaskPoint", "TaskPointTemplate");
 }
        private void OnArgsGUI()
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label("Args", GUILayout.Width(LabelWidth));
            string argsName = Target.Args != null?Target.Args.GetType().FullName : "<None>";

            if (GUILayout.Button(argsName, EditorStyles.popup, GUILayout.Width(EditorGUIUtility.currentViewWidth - LabelWidth - 25)))
            {
                GenericMenu gm = new GenericMenu();
                gm.AddItem(new GUIContent("<None>"), Target.Args == null, () =>
                {
                    if (_argsEditor != null)
                    {
                        DestroyImmediate(_argsEditor);
                        _argsEditor = null;
                    }
                    if (Target.Args != null)
                    {
                        Undo.DestroyObjectImmediate(Target.Args);
                        Target.Args = null;
                        HasChanged();
                    }
                });
                gm.AddItem(new GUIContent("<New Args Script>"), false, () =>
                {
                    EditorGlobalTools.CreateScriptFormTemplate(EditorPrefsTable.Script_FSMArgs_Folder, "FSMArgs", "FSMArgsTemplate");
                });
                gm.AddSeparator("");
                Type argsType = Target.Args != null?Target.Args.GetType() : null;

                List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type =>
                {
                    return(type.IsSubclassOf(typeof(FSMArgsBase)) && !type.IsAbstract);
                });
                for (int i = 0; i < types.Count; i++)
                {
                    int j = i;
                    gm.AddItem(new GUIContent(types[j].FullName), argsType == types[j], () =>
                    {
                        if (argsType != types[j])
                        {
                            if (_argsEditor != null)
                            {
                                DestroyImmediate(_argsEditor);
                                _argsEditor = null;
                            }
                            if (Target.Args != null)
                            {
                                Undo.DestroyObjectImmediate(Target.Args);
                                Target.Args = null;
                                HasChanged();
                            }

                            Target.Args           = Undo.AddComponent(Target.gameObject, types[j]) as FSMArgsBase;
                            Target.Args.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;
                            HasChanged();
                        }
                    });
                }
                gm.ShowAsContext();
            }
            GUILayout.EndHorizontal();

            if (Target.Args != null)
            {
                if (_argsEditor == null)
                {
                    _argsEditor = CreateEditor(Target.Args);
                }

                GUILayout.BeginVertical("Icon.InfiniteTrack");
                GUILayout.Space(5);

                _argsEditor.OnInspectorGUI();

                GUILayout.Space(5);
                GUILayout.EndVertical();
            }
        }