protected override void OnInspectorDefaultGUI() { base.OnInspectorDefaultGUI(); GUI.enabled = !EditorApplication.isPlaying; GUILayout.BeginHorizontal(); GUILayout.Label("InputDevice "); if (GUILayout.Button(Target.InputDeviceType, EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(InputDeviceBase)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { int j = i; gm.AddItem(new GUIContent(types[j].FullName), Target.InputDeviceType == types[j].FullName, () => { Undo.RecordObject(target, "Set InputDevice"); Target.InputDeviceType = types[j].FullName; HasChanged(); }); } gm.ShowAsContext(); } GUILayout.EndHorizontal(); GUI.enabled = true; }
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(); }
protected override void OnEnable() { base.OnEnable(); _components.Clear(); _componentInfos.Clear(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies((type) => { return(type.IsSubclassOf(typeof(ECS_Component)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { _components.Add(types[i]); _componentInfos.Add(types[i], new ECS_ComponentInfo(types[i])); } _systems.Clear(); _systemInfos.Clear(); types = ReflectionToolkit.GetTypesInRunTimeAssemblies((type) => { return(type.IsSubclassOf(typeof(ECS_System)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { _systems.Add(types[i]); _systemInfos.Add(types[i], new ECS_SystemInfo(types[i], _componentInfos)); } Entity = null; }
public DebuggerScene() { Type baseType = typeof(DebuggerComponentBase); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(); for (int i = 0; i < types.Count; i++) { if (types[i].IsSubclassOf(baseType)) { CustomDebuggerAttribute attr = types[i].GetCustomAttribute <CustomDebuggerAttribute>(); if (attr != null) { _debuggerComponents.Add(attr.InspectedType, types[i]); } } } baseType = typeof(Component); for (int i = 0; i < types.Count; i++) { if (types[i].IsSubclassOf(baseType)) { _componentTypes.Add(types[i]); } } }
private void MainDataGUI() { GUILayout.BeginHorizontal(); GUILayout.Label("MainData", GUILayout.Width(LabelWidth)); if (GUILayout.Button(Target.MainDataType, EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(MainDataBase))); }); gm.AddItem(new GUIContent("<None>"), Target.MainDataType == "<None>", () => { Undo.RecordObject(target, "Set Main Data"); Target.MainDataType = "<None>"; HasChanged(); }); for (int i = 0; i < types.Count; i++) { int j = i; gm.AddItem(new GUIContent(types[j].FullName), Target.MainDataType == types[j].FullName, () => { Undo.RecordObject(target, "Set Main Data"); Target.MainDataType = types[j].FullName; HasChanged(); }); } gm.ShowAsContext(); } GUILayout.EndHorizontal(); }
/// <summary> /// 初始化助手 /// </summary> public void OnInitialization() { _module = Module as EntityManager; _entityRoot = _module.transform.Find("EntityRoot"); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(EntityLogicBase)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { EntityResourceAttribute attribute = types[i].GetCustomAttribute <EntityResourceAttribute>(); if (attribute != null) { Entities.Add(types[i], new List <EntityLogicBase>()); GameObject group = new GameObject(types[i].Name + "[Group]"); group.transform.SetParent(_entityRoot); group.transform.localPosition = Vector3.zero; group.transform.localRotation = Quaternion.identity; group.transform.localScale = Vector3.one; group.SetActive(true); _entitiesGroup.Add(types[i], group); ObjectPools.Add(types[i], new Queue <GameObject>()); } else { throw new HTFrameworkException(HTFrameworkModule.Entity, "创建实体逻辑对象失败:实体逻辑类 " + types[i].Name + " 丢失 EntityResourceAttribute 标记!"); } } }
protected override void OnDefaultEnable() { base.OnDefaultEnable(); _module = Target as InternalModuleBase <H>; _types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(typeof(H).IsAssignableFrom(type) && typeof(H) != type); }); }
/// <summary> /// 初始化助手 /// </summary> public void OnInitialization() { List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(DataSetBase))); }); for (int i = 0; i < types.Count; i++) { DataSets.Add(types[i], new List <DataSetBase>()); } }
/// <summary> /// 初始化助手 /// </summary> public void OnInitialization() { List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(ECS_System))); }); for (int i = 0; i < types.Count; i++) { Systems.Add(types[i], Activator.CreateInstance(types[i]) as ECS_System); } }
/// <summary> /// 初始化助手 /// </summary> public void OnInitialization() { List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(EventHandlerBase)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { EventHandlerList1.Add(types[i], null); EventHandlerList2.Add(types[i], null); EventHandlerList3.Add(types[i], null); } }
private void LicenseGUI() { GUILayout.BeginVertical(EditorGlobalTools.Styles.Box); GUILayout.BeginHorizontal(); GUILayout.Space(10); _showLicense = EditorGUILayout.Foldout(_showLicense, "License", true); GUILayout.EndHorizontal(); if (_showLicense) { GUILayout.BeginHorizontal(); Toggle(Target.IsPermanentLicense, out Target.IsPermanentLicense, "Permanent License"); GUILayout.EndHorizontal(); if (!Target.IsPermanentLicense) { GUILayout.BeginHorizontal(); GUILayout.Label("Licenser"); if (GUILayout.Button(Target.LicenserType, EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(LicenserBase)) && !type.IsAbstract); }); gm.AddItem(new GUIContent("<None>"), Target.LicenserType == "<None>", () => { Undo.RecordObject(target, "Set Licenser"); Target.LicenserType = "<None>"; HasChanged(); }); for (int i = 0; i < types.Count; i++) { int j = i; gm.AddItem(new GUIContent(types[j].FullName), Target.LicenserType == types[j].FullName, () => { Undo.RecordObject(target, "Set Licenser"); Target.LicenserType = types[j].FullName; HasChanged(); }); } gm.ShowAsContext(); } GUILayout.EndHorizontal(); } } GUILayout.EndVertical(); }
internal override void OnInitialization() { base.OnInitialization(); //注册所有数据集 List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(DataSetBase))); }); for (int i = 0; i < types.Count; i++) { _dataSets.Add(types[i], new List <DataSetBase>()); } }
internal override void OnInitialization() { base.OnInitialization(); //注册所有存在的事件 List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(EventHandlerBase))); }); for (int i = 0; i < types.Count; i++) { _eventHandlerList1.Add(types[i], null); _eventHandlerList2.Add(types[i], null); _eventHandlerList3.Add(types[i], null); } }
private void ChangeHelper() { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(HelperInterface.IsAssignableFrom(type) && HelperInterface != type); }); for (int i = 0; i < types.Count; i++) { int j = i; gm.AddItem(new GUIContent(types[j].FullName), _module.HelperType == types[j].FullName, () => { _module.HelperType = types[j].FullName; }); } gm.ShowAsContext(); }
internal override void OnInitialization() { base.OnInitialization(); for (int i = 0; i < DefineEntityNames.Count; i++) { if (!_defineEntities.ContainsKey(DefineEntityNames[i])) { _defineEntities.Add(DefineEntityNames[i], DefineEntityTargets[i]); } } _entityRoot = transform.Find("EntityRoot"); //创建所有实体的逻辑对象 List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(EntityLogicBase))); }); for (int i = 0; i < types.Count; i++) { EntityResourceAttribute attribute = types[i].GetCustomAttribute <EntityResourceAttribute>(); if (attribute != null) { _entities.Add(types[i], new List <EntityLogicBase>()); GameObject group = new GameObject(types[i].Name + "[Group]"); group.transform.SetParent(_entityRoot); group.transform.localPosition = Vector3.zero; group.transform.localRotation = Quaternion.identity; group.transform.localScale = Vector3.one; group.SetActive(true); _entitiesGroup.Add(types[i], group); _objectPool.Add(types[i], new Queue <GameObject>()); } else { throw new HTFrameworkException(HTFrameworkModule.Entity, "创建实体逻辑对象失败:实体逻辑类 " + types[i].Name + " 丢失 EntityResourceAttribute 标记!"); } } }
/// <summary> /// 初始化助手 /// </summary> public void OnInitialization() { List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(CustomModuleBase)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { CustomModuleAttribute att = types[i].GetCustomAttribute <CustomModuleAttribute>(); if (att != null && att.IsEnable && !CustomModules.ContainsKey(att.ModuleName)) { CustomModules.Add(att.ModuleName, Activator.CreateInstance(types[i]) as CustomModuleBase); } } foreach (var module in CustomModules) { module.Value.OnInitialization(); } }
protected override void OnInspectorDefaultGUI() { base.OnInspectorDefaultGUI(); GUILayout.BeginHorizontal(); Toggle(Target.IsEnableDebugger, out Target.IsEnableDebugger, "Is Enable Debugger"); GUILayout.EndHorizontal(); if (Target.IsEnableDebugger) { GUILayout.BeginHorizontal(); GUILayout.Label("Debugger", GUILayout.Width(100)); if (GUILayout.Button(Target.DebuggerType, EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type == typeof(Debugger) || type.IsSubclassOf(typeof(Debugger))); }); for (int i = 0; i < types.Count; i++) { int j = i; gm.AddItem(new GUIContent(types[j].FullName), Target.DebuggerType == types[j].FullName, () => { Undo.RecordObject(target, "Set Debugger"); Target.DebuggerType = types[j].FullName; HasChanged(); }); } gm.ShowAsContext(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Debugger Skin", GUILayout.Width(100)); ObjectField(Target.DebuggerSkin, out Target.DebuggerSkin, false, ""); GUILayout.EndHorizontal(); } }
/// <summary> /// 生成任务内容列表 /// </summary> private void GenerateTaskList() { if (_taskContentList == null) { _taskContentList = new ReorderableList(_asset.Content, typeof(TaskContentBase), true, true, false, false); _taskContentList.drawHeaderCallback = (Rect rect) => { Rect sub = rect; sub.Set(rect.x, rect.y, 200, rect.height); GUI.Label(sub, "Task Content List:"); sub.Set(rect.x + rect.width - 20, rect.y - 2, 20, 20); if (GUI.Button(sub, _addGUIContent, "InvisibleButton")) { GenericMenu gm = new GenericMenu(); gm.AddItem(new GUIContent("<New Task Content Script>"), false, () => { NewTaskContentScript(); }); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(TaskContentBase))); }); for (int i = 0; i < types.Count; i++) { Type type = types[i]; string contentName = type.FullName; TaskContentAttribute attri = type.GetCustomAttribute <TaskContentAttribute>(); if (attri != null) { contentName = attri.Name; } gm.AddItem(new GUIContent(contentName), false, () => { AddContent(type); }); } gm.ShowAsContext(); } }; _taskContentList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (index >= 0 && index < _asset.Content.Count) { Rect sub = rect; GUI.Label(sub, (index + 1).ToString() + "." + _asset.Content[index].Name); if (isActive) { sub.Set(rect.x + rect.width - 40, rect.y, 20, 20); if (GUI.Button(sub, _editGUIContent, "InvisibleButton")) { MonoScript monoScript = MonoScript.FromScriptableObject(_asset.Content[index]); AssetDatabase.OpenAsset(monoScript); } sub.Set(rect.x + rect.width - 20, rect.y, 20, 20); if (GUI.Button(sub, _deleteGUIContent, "InvisibleButton")) { if (EditorUtility.DisplayDialog("Prompt", "Are you sure delete task [" + _asset.Content[index].Name + "]?", "Yes", "No")) { DeleteContent(index); } } } } }; _taskContentList.onSelectCallback = (ReorderableList list) => { if (list.index >= 0 && list.index < _asset.Content.Count) { _currentContent = _asset.Content[list.index]; } else { _currentContent = null; } }; _taskContentList.drawElementBackgroundCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (index >= 0 && index < _asset.Content.Count) { if (Event.current.type == EventType.Repaint) { GUIStyle gUIStyle = (index % 2 != 0) ? "CN EntryBackEven" : "CN EntryBackodd"; gUIStyle = (!isActive && !isFocused) ? gUIStyle : "RL Element"; gUIStyle.Draw(rect, false, isActive, isActive, isFocused); if (_asset.Content[index].IsDone) { GUI.backgroundColor = Color.green; GUI.Box(rect, ""); GUI.backgroundColor = Color.white; } } } }; } }
/// <summary> /// 任务点GUI事件处理 /// </summary> private void OnPointEventHandle() { if (_currentContent != null && Event.current != null) { Vector2 mousePosition = Event.current.mousePosition; switch (Event.current.type) { case EventType.MouseDown: if (Event.current.button == 1) { GenericMenu gm = new GenericMenu(); gm.AddItem(new GUIContent("<New Task Point Script>"), false, () => { NewTaskPointScript(); }); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(TaskPointBase))); }); for (int i = 0; i < types.Count; i++) { Type type = types[i]; string contentName = type.FullName; TaskPointAttribute attri = type.GetCustomAttribute <TaskPointAttribute>(); if (attri != null) { contentName = attri.Name; } gm.AddItem(new GUIContent("Add Task Point/" + contentName), false, () => { AddPoint(type, mousePosition); }); } StringToolkit.BeginNoRepeatNaming(); for (int i = 0; i < _currentContent.Points.Count; i++) { TaskPointBase point = _currentContent.Points[i]; gm.AddItem(new GUIContent(StringToolkit.GetNoRepeatName("Find Task Point/" + point.Name)), false, () => { FindPoint(point); }); } gm.ShowAsContext(); } break; case EventType.MouseDrag: if (Event.current.button == 2) { for (int i = 0; i < _currentContent.Points.Count; i++) { _currentContent.Points[i].OnDrag(Event.current.delta); } GUI.changed = true; } break; } for (int i = 0; i < _currentContent.Points.Count; i++) { _currentContent.Points[i].OnPointEventHandle(Event.current, _currentContent); } } }
protected override void OnInspectorDefaultGUI() { base.OnInspectorDefaultGUI(); GUI.enabled = !EditorApplication.isPlaying; GUILayout.BeginHorizontal(); Toggle(Target.IsEnableOverlayUI, out Target.IsEnableOverlayUI, "Is Enable Overlay UI"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); Toggle(Target.IsEnableCameraUI, out Target.IsEnableCameraUI, "Is Enable Camera UI"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); Toggle(Target.IsEnableWorldUI, out Target.IsEnableWorldUI, "Is Enable World UI"); GUILayout.EndHorizontal(); GUILayout.BeginVertical(EditorGlobalTools.Styles.Box); GUILayout.BeginHorizontal(); GUILayout.Label("Define UI:"); GUILayout.EndHorizontal(); for (int i = 0; i < Target.DefineUINames.Count; i++) { GUILayout.BeginVertical(EditorStyles.helpBox); GUILayout.BeginHorizontal(); GUILayout.Label("Type", GUILayout.Width(40)); if (GUILayout.Button(Target.DefineUINames[i], EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(UILogicBase)) && !type.IsAbstract); }); for (int m = 0; m < types.Count; m++) { int j = i; int n = m; if (Target.DefineUINames.Contains(types[n].FullName)) { gm.AddDisabledItem(new GUIContent(types[n].FullName)); } else { gm.AddItem(new GUIContent(types[n].FullName), Target.DefineUINames[j] == types[n].FullName, () => { Undo.RecordObject(target, "Set Define UI Name"); Target.DefineUINames[j] = types[n].FullName; HasChanged(); }); } } gm.ShowAsContext(); } GUI.backgroundColor = Color.red; if (GUILayout.Button("Delete", EditorStyles.miniButton, GUILayout.Width(50))) { Undo.RecordObject(target, "Delete Define UI"); Target.DefineUINames.RemoveAt(i); Target.DefineUIEntitys.RemoveAt(i); HasChanged(); continue; } GUI.backgroundColor = Color.white; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Entity", GUILayout.Width(40)); GameObject entity = Target.DefineUIEntitys[i]; ObjectField(Target.DefineUIEntitys[i], out entity, false, ""); if (entity != Target.DefineUIEntitys[i]) { Target.DefineUIEntitys[i] = entity; } GUILayout.EndHorizontal(); GUILayout.EndVertical(); } GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("New", EditorStyles.miniButton)) { Undo.RecordObject(target, "New Define UI"); Target.DefineUINames.Add("<None>"); Target.DefineUIEntitys.Add(null); HasChanged(); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUI.enabled = true; }
/// <summary> /// 初始化助手 /// </summary> public void OnInitialization() { _module = Module as UIManager; for (int i = 0; i < _module.DefineUINames.Count; i++) { if (!_defineUIAndEntitys.ContainsKey(_module.DefineUINames[i])) { _defineUIAndEntitys.Add(_module.DefineUINames[i], _module.DefineUIEntitys[i]); } } _UIEntity = _module.transform.FindChildren("UIEntity"); _overlayUIRoot = _UIEntity.transform.Find("OverlayUIRoot"); _overlayUIRootRect = _overlayUIRoot.rectTransform(); _overlayResidentPanel = _overlayUIRoot.Find("ResidentPanel"); _overlayTemporaryPanel = _overlayUIRoot.Find("TemporaryPanel"); _cameraUIRoot = _UIEntity.transform.Find("CameraUIRoot"); _cameraUIRootRect = _cameraUIRoot.rectTransform(); _cameraResidentPanel = _cameraUIRoot.Find("ResidentPanel"); _cameraTemporaryPanel = _cameraUIRoot.Find("TemporaryPanel"); _worldUIRoot = _UIEntity.transform.Find("WorldUIRoot"); _maskPanel = _overlayUIRoot.FindChildren("MaskPanel"); UICamera = _UIEntity.GetComponentByChild <Camera>("UICamera"); _overlayUIRoot.gameObject.SetActive(_module.IsEnableOverlayUI); _cameraUIRoot.gameObject.SetActive(_module.IsEnableCameraUI); UICamera.gameObject.SetActive(_module.IsEnableCameraUI); _worldUIRoot.gameObject.SetActive(_module.IsEnableWorldUI); //创建所有UI的逻辑对象 List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return((type.IsSubclassOf(typeof(UILogicResident)) || type.IsSubclassOf(typeof(UILogicTemporary))) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { UIResourceAttribute attribute = types[i].GetCustomAttribute <UIResourceAttribute>(); if (attribute != null) { switch (attribute.EntityType) { case UIType.Overlay: if (_module.IsEnableOverlayUI) { OverlayUIs.Add(types[i], Activator.CreateInstance(types[i]) as UILogicBase); } break; case UIType.Camera: if (_module.IsEnableCameraUI) { CameraUIs.Add(types[i], Activator.CreateInstance(types[i]) as UILogicBase); } break; case UIType.World: if (_module.IsEnableWorldUI) { if (!WorldUIs.ContainsKey(attribute.WorldUIDomainName)) { WorldUIs.Add(attribute.WorldUIDomainName, new UIWorldDomain(attribute.WorldUIDomainName, _worldUIRoot.FindChildren("CanvasTem"))); } WorldUIs[attribute.WorldUIDomainName].Injection(types[i]); } break; } } else { throw new HTFrameworkException(HTFrameworkModule.UI, "创建UI逻辑对象失败:UI逻辑类 " + types[i].Name + " 丢失 UIResourceAttribute 标记!"); } } }
protected override void OnDefaultEnable() { base.OnDefaultEnable(); if (Targets.Length > 1) { return; } _stateGC = new GUIContent(); _stateGC.image = EditorGUIUtility.IconContent("AnimatorState Icon").image; _addGC = new GUIContent(); _addGC.image = EditorGUIUtility.IconContent("d_Toolbar Plus More").image; _addGC.tooltip = "Add a new state"; _removeGC = new GUIContent(); _removeGC.image = EditorGUIUtility.IconContent("d_Toolbar Minus").image; _removeGC.tooltip = "Remove select state"; _defaultGC = new GUIContent(); _defaultGC.image = EditorGUIUtility.IconContent("TimelineEditModeRippleON").image; _defaultGC.tooltip = "Default state"; _finalGC = new GUIContent(); _finalGC.image = EditorGUIUtility.IconContent("TimelineEditModeReplaceON").image; _finalGC.tooltip = "Final state"; _editGC = new GUIContent(); _editGC.image = EditorGUIUtility.IconContent("d_editicon.sml").image; _editGC.tooltip = "Edit state script"; _states = GetProperty("States"); _stateList = new ReorderableList(serializedObject, _states, true, true, false, false); _stateList.drawHeaderCallback = (Rect rect) => { Rect sub = rect; sub.Set(rect.x, rect.y, 200, rect.height); GUI.Label(sub, "Enabled States:"); if (!EditorApplication.isPlaying) { sub.Set(rect.x + rect.width - 40, rect.y - 2, 20, 20); if (GUI.Button(sub, _addGC, "InvisibleButton")) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(FiniteStateBase)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { int j = i; string stateName = types[j].FullName; FiniteStateNameAttribute fsmAtt = types[j].GetCustomAttribute <FiniteStateNameAttribute>(); if (fsmAtt != null) { stateName = fsmAtt.Name; } if (Target.States.Contains(types[j].FullName)) { gm.AddDisabledItem(new GUIContent(stateName)); } else { gm.AddItem(new GUIContent(stateName), false, () => { Undo.RecordObject(target, "Add FSM State"); Target.States.Add(types[j].FullName); if (string.IsNullOrEmpty(Target.DefaultState)) { Target.DefaultState = Target.States[0]; } if (string.IsNullOrEmpty(Target.FinalState)) { Target.FinalState = Target.States[0]; } HasChanged(); }); } } gm.ShowAsContext(); } sub.Set(rect.x + rect.width - 20, rect.y - 2, 20, 20); GUI.enabled = _stateList.index >= 0 && _stateList.index < Target.States.Count; if (GUI.Button(sub, _removeGC, "InvisibleButton")) { Undo.RecordObject(target, "Delete FSM State"); if (Target.DefaultState == Target.States[_stateList.index]) { Target.DefaultState = null; } if (Target.FinalState == Target.States[_stateList.index]) { Target.FinalState = null; } Target.States.RemoveAt(_stateList.index); if (string.IsNullOrEmpty(Target.DefaultState) && Target.States.Count > 0) { Target.DefaultState = Target.States[0]; } if (string.IsNullOrEmpty(Target.FinalState) && Target.States.Count > 0) { Target.FinalState = Target.States[0]; } HasChanged(); } GUI.enabled = true; } }; _stateList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (index >= 0 && index < Target.States.Count) { SerializedProperty property = _states.GetArrayElementAtIndex(index); string stateType = property.stringValue; if (!_stateNames.ContainsKey(stateType)) { Type type = ReflectionToolkit.GetTypeInRunTimeAssemblies(stateType); if (type != null) { string stateName = type.FullName; FiniteStateNameAttribute fsmAtt = type.GetCustomAttribute <FiniteStateNameAttribute>(); if (fsmAtt != null) { stateName = fsmAtt.Name; } _stateNames.Add(stateType, stateName); } else { _stateNames.Add(stateType, "<Missing>"); } } Rect subrect = rect; subrect.Set(rect.x, rect.y + 2, rect.width, 16); _stateGC.text = _stateNames[stateType]; GUI.color = _stateGC.text != "<Missing>" ? Color.white : Color.red; GUI.Label(subrect, _stateGC); GUI.color = Color.white; int size = 20; if (Target.FinalState == stateType) { subrect.Set(rect.x + rect.width - size, rect.y + 2, 20, 16); if (GUI.Button(subrect, _finalGC, "InvisibleButton")) { GenericMenu gm = new GenericMenu(); foreach (var state in _stateNames) { gm.AddItem(new GUIContent(state.Value), Target.FinalState == state.Key, () => { Undo.RecordObject(target, "Set FSM Final State"); Target.FinalState = state.Key; HasChanged(); }); } gm.ShowAsContext(); } size += 20; } if (Target.DefaultState == stateType) { subrect.Set(rect.x + rect.width - size, rect.y + 2, 20, 16); if (GUI.Button(subrect, _defaultGC, "InvisibleButton")) { GenericMenu gm = new GenericMenu(); foreach (var state in _stateNames) { gm.AddItem(new GUIContent(state.Value), Target.DefaultState == state.Key, () => { Undo.RecordObject(target, "Set FSM Default State"); Target.DefaultState = state.Key; HasChanged(); }); } gm.ShowAsContext(); } size += 20; } if (isActive && isFocused) { subrect.Set(rect.x + rect.width - size, rect.y, 20, 20); if (GUI.Button(subrect, _editGC, "InvisibleButton")) { MonoScriptToolkit.OpenMonoScript(stateType); } size += 20; } } }; _stateList.drawElementBackgroundCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (Event.current.type == EventType.Repaint) { GUIStyle gUIStyle = (index % 2 != 0) ? "CN EntryBackEven" : "CN EntryBackodd"; gUIStyle = (!isActive && !isFocused) ? gUIStyle : "RL Element"; rect.x += 2; rect.width -= 6; gUIStyle.Draw(rect, false, isActive, isActive, isFocused); } }; _stateNames = new Dictionary <string, string>(); if (Target.Args == null) { FSMArgsBase args = Target.GetComponent <FSMArgsBase>(); if (args != null) { Target.Args = args; HasChanged(); } } if (Target.Args != null) { Target.Args.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector; } }
protected override void OnInspectorDefaultGUI() { base.OnInspectorDefaultGUI(); GUILayout.BeginHorizontal(); GUI.enabled = Target.DefaultProcedure != ""; GUILayout.Label("Default: " + Target.DefaultProcedure); GUI.enabled = true; GUILayout.FlexibleSpace(); GUI.enabled = Target.ActivatedProcedures.Count > 0; if (GUILayout.Button("Set Default", EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); for (int i = 0; i < Target.ActivatedProcedures.Count; i++) { int j = i; gm.AddItem(new GUIContent(Target.ActivatedProcedures[j]), Target.DefaultProcedure == Target.ActivatedProcedures[j], () => { Undo.RecordObject(target, "Set Default Procedure"); Target.DefaultProcedure = Target.ActivatedProcedures[j]; HasChanged(); }); } gm.ShowAsContext(); } GUI.enabled = true; GUILayout.EndHorizontal(); GUILayout.BeginVertical(EditorGlobalTools.Styles.Box); GUILayout.BeginHorizontal(); GUILayout.Label("Enabled Procedures:"); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); for (int i = 0; i < Target.ActivatedProcedures.Count; i++) { GUILayout.BeginHorizontal(); GUILayout.Label((i + 1) + "." + Target.ActivatedProcedures[i]); GUILayout.FlexibleSpace(); if (GUILayout.Button("▲", EditorStyles.miniButtonLeft)) { if (i > 0) { Undo.RecordObject(target, "Set Procedure Order"); string procedure = Target.ActivatedProcedures[i]; Target.ActivatedProcedures.RemoveAt(i); Target.ActivatedProcedures.Insert(i - 1, procedure); HasChanged(); continue; } } if (GUILayout.Button("▼", EditorStyles.miniButtonMid)) { if (i < Target.ActivatedProcedures.Count - 1) { Undo.RecordObject(target, "Set Procedure Order"); string procedure = Target.ActivatedProcedures[i]; Target.ActivatedProcedures.RemoveAt(i); Target.ActivatedProcedures.Insert(i + 1, procedure); HasChanged(); continue; } } if (GUILayout.Button("Edit", EditorStyles.miniButtonMid)) { MonoScriptToolkit.OpenMonoScript(Target.ActivatedProcedures[i]); } if (GUILayout.Button("Delete", EditorStyles.miniButtonRight)) { Undo.RecordObject(target, "Delete Procedure"); if (Target.DefaultProcedure == Target.ActivatedProcedures[i]) { Target.DefaultProcedure = ""; } Target.ActivatedProcedures.RemoveAt(i); if (Target.DefaultProcedure == "" && Target.ActivatedProcedures.Count > 0) { Target.DefaultProcedure = Target.ActivatedProcedures[0]; } HasChanged(); } GUILayout.EndHorizontal(); } GUILayout.BeginHorizontal(); if (GUILayout.Button("Add Procedure", EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(ProcedureBase))); }); for (int i = 0; i < types.Count; i++) { int j = i; if (Target.ActivatedProcedures.Contains(types[j].FullName)) { gm.AddDisabledItem(new GUIContent(types[j].FullName)); } else { gm.AddItem(new GUIContent(types[j].FullName), false, () => { Undo.RecordObject(target, "Add Procedure"); Target.ActivatedProcedures.Add(types[j].FullName); if (Target.DefaultProcedure == "") { Target.DefaultProcedure = Target.ActivatedProcedures[0]; } HasChanged(); }); } } gm.ShowAsContext(); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
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(); } }
protected override void OnInspectorDefaultGUI() { base.OnInspectorDefaultGUI(); GUILayout.BeginHorizontal(); EditorGUILayout.HelpBox("Finite state machine!", MessageType.Info); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); Toggle(Target.IsAutoRegister, out Target.IsAutoRegister, "Auto Register"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); TextField(Target.Name, out Target.Name, "Name"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); TextField(Target.Group, out Target.Group, "Group"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUI.color = Target.Data == "<None>" ? Color.gray : Color.white; GUILayout.Label("Data", GUILayout.Width(60)); if (GUILayout.Button(Target.Data, EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); gm.AddItem(new GUIContent("<None>"), Target.Data == "<None>", () => { Undo.RecordObject(target, "Set FSM Data Class"); Target.Data = "<None>"; HasChanged(); }); 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(); } GUI.color = Color.white; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUI.enabled = Target.DefaultStateName != ""; GUILayout.Label("Default: " + Target.DefaultStateName); GUI.enabled = true; GUILayout.FlexibleSpace(); GUI.enabled = Target.StateNames.Count > 0; if (GUILayout.Button("Set Default", EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); for (int i = 0; i < Target.StateNames.Count; i++) { int j = i; gm.AddItem(new GUIContent(Target.StateNames[j]), Target.DefaultStateName == Target.StateNames[j], () => { Undo.RecordObject(target, "Set FSM Default State"); Target.DefaultState = Target.States[j]; Target.DefaultStateName = Target.StateNames[j]; HasChanged(); }); } gm.ShowAsContext(); } GUI.enabled = true; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUI.enabled = Target.FinalStateName != ""; GUILayout.Label("Final: " + Target.FinalStateName); GUI.enabled = true; GUILayout.FlexibleSpace(); GUI.enabled = Target.StateNames.Count > 0; if (GUILayout.Button("Set Final", EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); for (int i = 0; i < Target.StateNames.Count; i++) { int j = i; gm.AddItem(new GUIContent(Target.StateNames[j]), Target.FinalStateName == Target.StateNames[j], () => { Undo.RecordObject(target, "Set FSM Final State"); Target.FinalState = Target.States[j]; Target.FinalStateName = Target.StateNames[j]; HasChanged(); }); } gm.ShowAsContext(); } GUI.enabled = true; GUILayout.EndHorizontal(); GUILayout.BeginVertical(EditorGlobalTools.Styles.Box); GUILayout.BeginHorizontal(); GUILayout.Label("Enabled State:"); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); for (int i = 0; i < Target.StateNames.Count; i++) { GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("{0}.{1}", i + 1, Target.StateNames[i])); GUILayout.FlexibleSpace(); if (GUILayout.Button("Edit", EditorStyles.miniButtonLeft)) { MonoScriptToolkit.OpenMonoScript(Target.States[i]); } if (GUILayout.Button("Delete", EditorStyles.miniButtonRight)) { Undo.RecordObject(target, "Delete FSM State"); if (Target.DefaultStateName == Target.StateNames[i]) { Target.DefaultState = ""; Target.DefaultStateName = ""; } if (Target.FinalStateName == Target.StateNames[i]) { Target.FinalState = ""; Target.FinalStateName = ""; } Target.States.RemoveAt(i); Target.StateNames.RemoveAt(i); if (Target.DefaultStateName == "" && Target.StateNames.Count > 0) { Target.DefaultState = Target.States[0]; Target.DefaultStateName = Target.StateNames[0]; } if (Target.FinalStateName == "" && Target.StateNames.Count > 0) { Target.FinalState = Target.States[0]; Target.FinalStateName = Target.StateNames[0]; } HasChanged(); } GUILayout.EndHorizontal(); } GUILayout.BeginHorizontal(); if (GUILayout.Button("Add State", EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(FiniteStateBase)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { int j = i; string stateName = types[j].FullName; FiniteStateNameAttribute fsmAtt = types[j].GetCustomAttribute <FiniteStateNameAttribute>(); if (fsmAtt != null) { stateName = fsmAtt.Name; } if (Target.States.Contains(types[j].FullName)) { gm.AddDisabledItem(new GUIContent(stateName)); } else { gm.AddItem(new GUIContent(stateName), false, () => { Undo.RecordObject(target, "Add FSM State"); Target.States.Add(types[j].FullName); Target.StateNames.Add(stateName); if (Target.DefaultStateName == "") { Target.DefaultState = Target.States[0]; Target.DefaultStateName = Target.StateNames[0]; } if (Target.FinalStateName == "") { Target.FinalState = Target.States[0]; Target.FinalStateName = Target.StateNames[0]; } HasChanged(); }); } } gm.ShowAsContext(); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
protected override void OnDefaultEnable() { base.OnDefaultEnable(); _addGC = new GUIContent(); _addGC.image = EditorGUIUtility.IconContent("d_Toolbar Plus More").image; _addGC.tooltip = "Add a new channel"; _removeGC = new GUIContent(); _removeGC.image = EditorGUIUtility.IconContent("d_Toolbar Minus").image; _removeGC.tooltip = "Remove select channel"; _editGC = new GUIContent(); _editGC.image = EditorGUIUtility.IconContent("d_editicon.sml").image; _editGC.tooltip = "Edit channel script"; _channelTypes = GetProperty("ChannelTypes"); _channelTypeList = new ReorderableList(serializedObject, _channelTypes, true, true, false, false); _channelTypeList.drawHeaderCallback = (Rect rect) => { Rect sub = rect; sub.Set(rect.x, rect.y, 200, rect.height); GUI.Label(sub, "Enabled Channels:"); if (!EditorApplication.isPlaying) { sub.Set(rect.x + rect.width - 40, rect.y - 2, 20, 20); if (GUI.Button(sub, _addGC, "InvisibleButton")) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(ProtocolChannelBase)) && !type.IsAbstract); }); for (int i = 0; i < types.Count; i++) { int j = i; if (Target.ChannelTypes.Contains(types[j].FullName)) { gm.AddDisabledItem(new GUIContent(types[j].FullName)); } else { gm.AddItem(new GUIContent(types[j].FullName), false, () => { Undo.RecordObject(target, "Add Channel"); Target.ChannelTypes.Add(types[j].FullName); HasChanged(); }); } } gm.ShowAsContext(); } sub.Set(rect.x + rect.width - 20, rect.y - 2, 20, 20); GUI.enabled = _channelTypeList.index >= 0 && _channelTypeList.index < Target.ChannelTypes.Count; if (GUI.Button(sub, _removeGC, "InvisibleButton")) { Undo.RecordObject(target, "Delete Channel"); Target.ChannelTypes.RemoveAt(_channelTypeList.index); HasChanged(); } GUI.enabled = true; } }; _channelTypeList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (index >= 0 && index < Target.ChannelTypes.Count) { Rect subrect = rect; subrect.Set(rect.x, rect.y + 2, rect.width, 16); GUI.Label(subrect, Target.ChannelTypes[index]); int size = 20; if (isActive && isFocused) { subrect.Set(rect.x + rect.width - size, rect.y, 20, 20); if (GUI.Button(subrect, _editGC, "InvisibleButton")) { MonoScriptToolkit.OpenMonoScript(Target.ChannelTypes[index]); } size += 20; } } }; _channelTypeList.drawElementBackgroundCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (Event.current.type == EventType.Repaint) { GUIStyle gUIStyle = (index % 2 != 0) ? "CN EntryBackEven" : "CN EntryBackodd"; gUIStyle = (!isActive && !isFocused) ? gUIStyle : "RL Element"; rect.x += 2; rect.width -= 6; gUIStyle.Draw(rect, false, isActive, isActive, isFocused); } }; }
protected override void OnInspectorDefaultGUI() { base.OnInspectorDefaultGUI(); GUI.enabled = !EditorApplication.isPlaying; GUILayout.BeginHorizontal(); TextField(Target.ServerIP, out Target.ServerIP, "Server IP"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); IntField(Target.ServerPort, out Target.ServerPort, "Server Port"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); TextField(Target.ClientIP, out Target.ClientIP, "Client IP"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); IntField(Target.ClientPort, out Target.ClientPort, "Client Port"); GUILayout.EndHorizontal(); GUILayout.BeginVertical(EditorGlobalTools.Styles.Box); GUILayout.BeginHorizontal(); GUILayout.Label("Enabled Channels:"); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); for (int i = 0; i < Target.ChannelTypes.Count; i++) { GUILayout.BeginHorizontal(); GUILayout.Label((i + 1) + "." + Target.ChannelTypes[i]); GUILayout.FlexibleSpace(); if (GUILayout.Button("Edit", EditorStyles.miniButtonLeft)) { MonoScriptToolkit.OpenMonoScript(Target.ChannelTypes[i]); } if (GUILayout.Button("Delete", EditorStyles.miniButtonRight)) { Undo.RecordObject(target, "Delete Channel"); Target.ChannelTypes.RemoveAt(i); HasChanged(); } GUILayout.EndHorizontal(); } GUILayout.BeginHorizontal(); if (GUILayout.Button("Add Channel", EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(ProtocolChannelBase))); }); for (int i = 0; i < types.Count; i++) { int j = i; if (Target.ChannelTypes.Contains(types[j].FullName)) { gm.AddDisabledItem(new GUIContent(types[j].FullName)); } else { gm.AddItem(new GUIContent(types[j].FullName), false, () => { Undo.RecordObject(target, "Add Channel"); Target.ChannelTypes.Add(types[j].FullName); HasChanged(); }); } } gm.ShowAsContext(); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUI.enabled = true; }
/// <summary> /// 任务点GUI事件处理 /// </summary> private void OnPointEventHandle() { if (_currentContent != null && Event.current != null) { Vector2 pos = Event.current.mousePosition; switch (Event.current.type) { case EventType.MouseDown: if (Event.current.button == 1) { GenericMenu gm = new GenericMenu(); gm.AddItem(new GUIContent(GetWord("Add Task Point") + "/默认"), false, () => { AddPoint(_currentContent, typeof(TaskPointDefault), pos); }); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(TaskPointBase)) && !type.IsAbstract && type != typeof(TaskPointDefault)); }); for (int i = 0; i < types.Count; i++) { Type type = types[i]; string pointName = type.FullName; TaskPointAttribute attribute = type.GetCustomAttribute <TaskPointAttribute>(); if (attribute != null) { pointName = attribute.Name; } gm.AddItem(new GUIContent(GetWord("Add Task Point") + "/" + pointName), false, () => { AddPoint(_currentContent, type, pos); }); } StringToolkit.BeginNoRepeatNaming(); for (int i = 0; i < _currentContent.Points.Count; i++) { TaskPointBase point = _currentContent.Points[i]; gm.AddItem(new GUIContent(StringToolkit.GetNoRepeatName(GetWord("Find Task Point") + "/" + point.Name)), false, () => { FindPoint(point); }); } gm.AddSeparator(""); CopyTaskPoint(gm); PasteTaskPoint(gm, pos); gm.AddSeparator(""); gm.AddItem(new GUIContent(GetWord("Collapse All")), false, () => { for (int i = 0; i < _currentContent.Points.Count; i++) { TaskPointBase point = _currentContent.Points[i]; point.IsExpand = false; } GUI.changed = true; }); gm.AddItem(new GUIContent(GetWord("Expand All")), false, () => { for (int i = 0; i < _currentContent.Points.Count; i++) { TaskPointBase point = _currentContent.Points[i]; point.IsExpand = true; } GUI.changed = true; }); gm.AddSeparator(""); gm.AddItem(new GUIContent(GetWord("Enable All")), false, () => { for (int i = 0; i < _currentContent.Points.Count; i++) { TaskPointBase point = _currentContent.Points[i]; point.IsEnable = true; } GUI.changed = true; }); gm.AddItem(new GUIContent(GetWord("Disable All")), false, () => { for (int i = 0; i < _currentContent.Points.Count; i++) { TaskPointBase point = _currentContent.Points[i]; point.IsEnable = false; } GUI.changed = true; }); gm.AddSeparator(""); gm.AddItem(new GUIContent(GetWord("<New Task Point Script>")), false, () => { NewTaskPointScript(); }); gm.ShowAsContext(); } break; case EventType.MouseDrag: if (Event.current.button == 2) { for (int i = 0; i < _currentContent.Points.Count; i++) { _currentContent.Points[i].OnDrag(Event.current.delta); } GUI.changed = true; } break; case EventType.KeyDown: switch (Event.current.keyCode) { case KeyCode.LeftAlt: case KeyCode.RightAlt: _isBreakDepend = true; GUI.changed = true; break; } break; case EventType.KeyUp: switch (Event.current.keyCode) { case KeyCode.LeftAlt: case KeyCode.RightAlt: _isBreakDepend = false; GUI.changed = true; break; } break; } for (int i = 0; i < _currentContent.Points.Count; i++) { _currentContent.Points[i].OnPointEventHandle(Event.current, _contentAsset, _currentContent, _getWord); } } }
protected override void OnDefaultEnable() { base.OnDefaultEnable(); _addGC = new GUIContent(); _addGC.image = EditorGUIUtility.IconContent("d_Toolbar Plus More").image; _addGC.tooltip = "Add a new define"; _removeGC = new GUIContent(); _removeGC.image = EditorGUIUtility.IconContent("d_Toolbar Minus").image; _removeGC.tooltip = "Remove select define"; _entityList = new ReorderableList(Target.DefineEntityNames, typeof(string), true, true, false, false); _entityList.elementHeight = 45; _entityList.drawHeaderCallback = (Rect rect) => { Rect sub = rect; sub.Set(rect.x, rect.y, 200, rect.height); GUI.Label(sub, "Define Entity:"); if (!EditorApplication.isPlaying) { sub.Set(rect.x + rect.width - 40, rect.y - 2, 20, 20); if (GUI.Button(sub, _addGC, "InvisibleButton")) { Target.DefineEntityNames.Add("<None>"); Target.DefineEntityTargets.Add(null); HasChanged(); } sub.Set(rect.x + rect.width - 20, rect.y - 2, 20, 20); GUI.enabled = _entityList.index >= 0 && _entityList.index < Target.DefineEntityNames.Count; if (GUI.Button(sub, _removeGC, "InvisibleButton")) { Target.DefineEntityNames.RemoveAt(_entityList.index); Target.DefineEntityTargets.RemoveAt(_entityList.index); HasChanged(); } GUI.enabled = true; } }; _entityList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (index >= 0 && index < Target.DefineEntityNames.Count) { Rect subrect = rect; subrect.Set(rect.x, rect.y + 2, 50, 16); GUI.Label(subrect, "Type"); if (isActive) { subrect.Set(rect.x + 50, rect.y + 2, rect.width - 50, 16); if (GUI.Button(subrect, Target.DefineEntityNames[index], EditorGlobalTools.Styles.MiniPopup)) { GenericMenu gm = new GenericMenu(); List <Type> types = ReflectionToolkit.GetTypesInRunTimeAssemblies(type => { return(type.IsSubclassOf(typeof(EntityLogicBase)) && !type.IsAbstract); }); for (int m = 0; m < types.Count; m++) { int j = index; int n = m; if (Target.DefineEntityNames.Contains(types[n].FullName)) { gm.AddDisabledItem(new GUIContent(types[n].FullName)); } else { gm.AddItem(new GUIContent(types[n].FullName), Target.DefineEntityNames[j] == types[n].FullName, () => { Target.DefineEntityNames[j] = types[n].FullName; HasChanged(); }); } } gm.ShowAsContext(); } } else { subrect.Set(rect.x + 50, rect.y + 2, rect.width - 50, 16); GUI.Label(subrect, Target.DefineEntityNames[index]); } subrect.Set(rect.x, rect.y + 22, 50, 16); GUI.Label(subrect, "Entity"); subrect.Set(rect.x + 50, rect.y + 22, rect.width - 50, 16); GameObject entity = EditorGUI.ObjectField(subrect, Target.DefineEntityTargets[index], typeof(GameObject), false) as GameObject; if (entity != Target.DefineEntityTargets[index]) { Target.DefineEntityTargets[index] = entity; HasChanged(); } } }; _entityList.drawElementBackgroundCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (Event.current.type == EventType.Repaint) { GUIStyle gUIStyle = (index % 2 != 0) ? "CN EntryBackEven" : "CN EntryBackodd"; gUIStyle = (!isActive && !isFocused) ? gUIStyle : "RL Element"; rect.x += 2; rect.width -= 6; gUIStyle.Draw(rect, false, isActive, isActive, isFocused); } }; _entityList.onReorderCallbackWithDetails = (ReorderableList list, int oldIndex, int newIndex) => { GameObject entity = Target.DefineEntityTargets[oldIndex]; Target.DefineEntityTargets.RemoveAt(oldIndex); Target.DefineEntityTargets.Insert(newIndex, entity); HasChanged(); }; }