/// <summary> /// 添加Act单元 /// </summary> /// <param name="actName"></param> private void addSkillAct(string group, string actName) { EditorWidgetState groupWidget = skillGroups[group]; ActSkillGroup skillGroup = groupWidget.Entity as ActSkillGroup; if (skillGroup.ActList == null) { skillGroup.ActList = new List <ActItemWidget>(); } //不允许相同组下,ACT重复 foreach (ActItemWidget item in skillGroup.ActList) { if (item.ActName == actName) { return; } } ActItemWidget itemWidget = new ActItemWidget(); itemWidget.GroupName = group; itemWidget.ActName = actName; skillGroup.ActList.Add(itemWidget); }
/// <summary> /// 初始化ACT项的属性,从文件目录加载配置 /// </summary> /// <param name="groupName">Act 的分组</param> /// <param name="actName">Act 的名称</param> public void InitActItemProperty(string groupName, string actName) { this.actGroup = groupName; this.actName = actName; //加载文件 string relativePath = string.Concat("Act/", groupName, "/", actName, ".act"); object[] property = localDataHelper.Import(relativePath); widgetList.Clear(); if (property == null) { return; //新建的文件没有本地数据 } int index = 0; foreach (object obj in property) { EditorWidgetState widget = new EditorWidgetState(); widget.Entity = obj; widget.FoldOut = index == 0; EditorGUIUtil.FindAllWidget(new List <EditorWidgetState>(), widget, widget.Entity); index++; widgetList.Add(widget); } }
/// <summary> /// 添加新的模块 /// </summary> private void onAddNewModuleGUI() { EditorGUIUtil.DrawHeader("Add New Module"); //添加模块视图 GUILayout.BeginHorizontal("AS TextArea", GUILayout.Height(30)); selectEnum = (ActModuleEnum)EditorGUILayout.EnumPopup("新模块", selectEnum, GUILayout.MaxWidth(Screen.width * 0.5f)); GUI.backgroundColor = Color.green; if (GUILayout.Button("Add", GUILayout.Width(60))) { if (string.IsNullOrEmpty(actName)) { return; } EditorWidgetState widget = new EditorWidgetState(); widget.Entity = Activator.CreateInstance(moduleMap[selectEnum]); widget.FoldOut = true; EditorGUIUtil.FindAllWidget(new List <EditorWidgetState>(), widget, widget.Entity); widgetList.Add(widget); } GUI.backgroundColor = Color.white; GUILayout.EndHorizontal(); }
/// <summary> /// 添加角色组 /// </summary> private void addSkillGroup(string name) { if (skillGroups.ContainsKey(name)) { return; } EditorWidgetState group = new EditorWidgetState(); group.CanRemove = true; ActSkillGroup asg = new ActSkillGroup(); asg.GroupName = name; group.Entity = asg; this.skillGroups.Add(name, group); // indexGroup = skillGroups.Count - 1; }
/// <summary> /// 查找所有的GUI可显示组件项 /// </summary> /// <param name="widgets"></param> /// <param name="obj"></param> public static void FindAllWidget(List <EditorWidgetState> widgets, EditorWidgetState parentWidget, object obj) { if (obj == null) { return; } Type objType = obj.GetType(); foreach (PropertyInfo propertyInfo in objType.GetProperties()) { Attribute attribute = Attribute.GetCustomAttribute(propertyInfo, typeof(InjectDataAttribute)); if (attribute == null) { continue; } InjectDataAttribute display = attribute as InjectDataAttribute; if (string.IsNullOrEmpty(display.DisplayName)) { continue; } Type propertyType = propertyInfo.PropertyType; if (!propertyType.IsEnum && !propertyType.IsValueType && !propertyType.Equals(typeof(System.String))) { EditorWidgetState childWidget = new EditorWidgetState(); object childObj = propertyInfo.GetValue(obj, null); childWidget.Entity = childObj == null?Activator.CreateInstance(propertyType) : childObj; if (childObj == null) { propertyInfo.SetValue(obj, childWidget.Entity, null); } widgets.Add(childWidget); FindAllWidget(new List <EditorWidgetState>(), childWidget, childWidget.Entity); } } parentWidget.SubWidget = widgets.ToArray(); }
/// <summary> /// 绘制实例 /// </summary> /// <param name="widgetState"></param> /// <param name="isRemove"></param> /// <returns></returns> public static bool OnGUIInstanceDisplay(EditorWidgetState widgetState, bool isRemove) { object obj = widgetState.Entity; if (obj == null) { return(false); } if (isRemove && widgetState.FoldOut) { NGUIEditorTools.DrawSeparator(); } GUILayout.BeginHorizontal(); widgetState.FoldOut = EditorGUILayout.Foldout(widgetState.FoldOut, widgetState.Entity.GetType().Name); if (isRemove && GUILayout.Button("X", GUILayout.Width(30))) { return(true); } GUILayout.EndHorizontal(); if (isRemove && widgetState.FoldOut) { NGUIEditorTools.DrawSeparator(); GUILayout.Space(10); } //如果被折叠,则不绘制具体的面板信息 if (!widgetState.FoldOut) { return(false); } EditorGUI.indentLevel++; Type objType = obj.GetType(); foreach (PropertyInfo propertyInfo in objType.GetProperties()) { Attribute attribute = Attribute.GetCustomAttribute(propertyInfo, typeof(InjectDataAttribute)); if (attribute == null) { continue; } InjectDataAttribute display = attribute as InjectDataAttribute; if (string.IsNullOrEmpty(display.DisplayName)) { continue; } Type propertyType = propertyInfo.PropertyType; if (propertyType.IsEnum || propertyType.IsValueType || propertyType.Equals(typeof(System.String))) { GUILayout.BeginHorizontal(); object result = OnGUIProperty(display.DisplayName, propertyType, propertyInfo.GetValue(obj, null)); propertyInfo.SetValue(obj, result, null); //更新修改值 GUILayout.EndHorizontal(); } } //遍历绘制子层数据 if (widgetState.SubWidget != null && widgetState.SubWidget.Length > 0) { EditorGUI.indentLevel++; foreach (EditorWidgetState subWidget in widgetState.SubWidget) { //bool lastFoldOut = subWidget.FoldOut; //NGUIEditorTools.DrawSeparator(); //if(lastFoldOut) NGUIEditorTools.DrawSeparator(); OnGUIInstanceDisplay(subWidget, false); } } return(false); }