private void OnGUI() { if (restart) { EditorGUILayout.LabelField("出现错误请重新打开"); return; } try { EditorGUILayout.BeginHorizontal(); //左侧的选择状态类型与保存面板 EditorGUILayout.BeginVertical(GUILayout.Width(100)); if (GUILayout.Button("保存", GUILayout.Width(95))) { string valueText = SerializeNow(dataDic); File.WriteAllText(dataDirecotryPath + "/Status.txt", valueText, Encoding.UTF8); EditorUtility.DisplayDialog("保存数据", "保存成功!", "确认"); } EditorGUILayout.LabelField("状态类型"); selectEnumStatusEffect = (EnumStatusEffect)EditorGUILayout.EnumPopup(selectEnumStatusEffect, GUILayout.Width(95)); FieldInfo fieldInfo = typeof(EnumStatusEffect).GetField(selectEnumStatusEffect.ToString()); FieldExplanAttribute fieldExplane = fieldInfo.GetCustomAttributes(typeof(FieldExplanAttribute), false).OfType <FieldExplanAttribute>().FirstOrDefault(); if (fieldExplane != null) { EditorGUILayout.LabelField(fieldExplane.GetExplan(), GUILayout.Width(95)); } EditorGUILayout.EndVertical(); //右侧显示详细信息面板 EditorGUILayout.BeginVertical(); rightScroll = EditorGUILayout.BeginScrollView(rightScroll); if (dataDic.ContainsKey(selectEnumStatusEffect)) { StatusDataInfo statusDataInfo = dataDic[selectEnumStatusEffect]; ReflectUnit <StatusDataInfo> statusDataInfoUnit = Entry.On(statusDataInfo); EditorGUILayout.BeginHorizontal(); //说明 EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("状态简要说明"); string statusExplane = EditorGUILayout.TextArea(statusDataInfo.StatusExplane, GUILayout.Width(200), GUILayout.Height(100)); if (!string.Equals(statusExplane, statusDataInfo.StatusExplane)) { statusDataInfoUnit.Field("statusExplane", statusExplane); } EditorGUILayout.EndVertical(); //图片 EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("状态的图标"); statusDataInfo.Load(); Sprite statusSprite = (Sprite)EditorGUILayout.ObjectField(statusDataInfo.StatusSprite, typeof(Sprite), true, GUILayout.Width(100), GUILayout.Height(100)); if (!Sprite.Equals(statusSprite, statusDataInfo.StatusSprite) && statusSprite != null) { string statusSpriteID = SpriteManager.GetName(statusSprite); statusDataInfoUnit.Field("statusSpriteID", statusSpriteID).End(); statusDataInfoUnit.Field("statusSprite", null); } EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); //不同等级的具体状态 Dictionary <int, StatusDataInfo.StatusLevelDataInfo> levelToDataDic = statusDataInfoUnit.Field <Dictionary <int, StatusDataInfo.StatusLevelDataInfo> >("levelToDataDic").Element; //等级 EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("最大等级:" + (levelToDataDic.Count - 1), GUILayout.Width(70)); if (levelToDataDic.Count > 0 && GUILayout.Button("-", GUILayout.Width(20))) { if (EditorUtility.DisplayDialog("警告!", "将会减去最后一个等级的数据!", "确认", "取消")) { levelToDataDic.Remove(levelToDataDic.Count - 1); } } if (GUILayout.Button("+", GUILayout.Width(20))) { levelToDataDic.Add(levelToDataDic.Count, new StatusDataInfo.StatusLevelDataInfo()); } EditorGUILayout.LabelField("当前选择:" + selectLevel, GUILayout.Width(70)); if (selectLevel > 0 && GUILayout.Button("-", GUILayout.Width(20))) { selectLevel--; } if (selectLevel < levelToDataDic.Count - 1 && GUILayout.Button("+", GUILayout.Width(20))) { selectLevel++; } selectLevel = Mathf.Clamp(selectLevel, 0, levelToDataDic.Count - 1); EditorGUILayout.EndHorizontal(); //具体状态 if (selectLevel >= 0 && selectLevel < levelToDataDic.Count) { StatusDataInfo.StatusLevelDataInfo statusLeveDataInfo = levelToDataDic[selectLevel]; EditorGUILayout.LabelField("具体说明"); statusLeveDataInfo.LevelExplane = EditorGUILayout.TextArea(statusLeveDataInfo.LevelExplane, GUILayout.Height(60)); //该等级的耗魔对应基础持续时间曲线 EditorGUILayout.LabelField("持续时间曲线设置:"); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("最小魔力:", GUILayout.Width(75)); statusLeveDataInfo.MinMana = EditorGUILayout.IntField(statusLeveDataInfo.MinMana, GUILayout.Width(75)); statusLeveDataInfo.DurationCuvre = EditorGUILayout.CurveField(statusLeveDataInfo.DurationCuvre, GUILayout.Width(150)); EditorGUILayout.LabelField("最大魔力:", GUILayout.Width(75)); statusLeveDataInfo.MaxMana = EditorGUILayout.IntField(statusLeveDataInfo.MaxMana, GUILayout.Width(75)); EditorGUILayout.EndHorizontal(); //设置具体的数据 EditorGUILayout.LabelField("具体数据设置:"); StatusActionAttribute statusAction = fieldInfo.GetCustomAttributes(typeof(StatusActionAttribute), false).OfType <StatusActionAttribute>().FirstOrDefault(); if (statusAction != null) { EnumStatusAction[] enumStatusActions = statusAction.GetStatusActions(); //如果不存在该项则添加 foreach (EnumStatusAction enumStatusAction in enumStatusActions) { if (!statusLeveDataInfo.StatusActionDataInfoDic.ContainsKey(enumStatusAction)) { Type t = assembly.GetType("StatusActionDataInfo_" + enumStatusAction.ToString()); if (t != null) { StatusActionDataInfo_Base sb = Activator.CreateInstance(t) as StatusActionDataInfo_Base; statusLeveDataInfo.StatusActionDataInfoDic.Add(enumStatusAction, sb); } } } //如果多余则删除 IEnumerable <EnumStatusAction> checkEnumStatusActions = statusLeveDataInfo.StatusActionDataInfoDic.Keys.OfType <EnumStatusAction>(); foreach (EnumStatusAction item in checkEnumStatusActions) { if (!enumStatusActions.Contains(item)) { statusLeveDataInfo.StatusActionDataInfoDic.Remove(item); } } //循环 Type enumStatusActionType = typeof(EnumStatusAction); foreach (KeyValuePair <EnumStatusAction, StatusActionDataInfo_Base> item in statusLeveDataInfo.StatusActionDataInfoDic) { FieldExplanAttribute fieldExplanAttribute = enumStatusActionType.GetField(item.Key.ToString()).GetCustomAttributes(typeof(FieldExplanAttribute), false).OfType <FieldExplanAttribute>().First(); if (fieldExplanAttribute != null) { EditorGUILayout.Space(); EditorGUILayout.LabelField(fieldExplanAttribute.GetExplan()); //显示该状态效果的名字 Type statusActionDataInfoBaseType = item.Value.GetType(); // assembly.GetType("StatusActionDataInfo_" + item.Key.ToString()); if (statusActionDataInfoBaseType != null) { FieldInfo[] statusActionDataInfoBaseInfos = statusActionDataInfoBaseType.GetFields(); //便利该效果对应的数据对象并显示 foreach (FieldInfo statusActionDataInfoBaseInfo in statusActionDataInfoBaseInfos) { object innerValueData = statusActionDataInfoBaseInfo.GetValue(item.Value); FieldExplanAttribute innerAttribute = statusActionDataInfoBaseInfo.GetCustomAttributes(typeof(FieldExplanAttribute), false).OfType <FieldExplanAttribute>().FirstOrDefault(); if (innerAttribute != null) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(innerAttribute.GetExplan()); if (statusActionDataInfoBaseInfo.FieldType.Equals(typeof(int))) { int innerValue = EditorGUILayout.IntField((int)innerValueData); statusActionDataInfoBaseInfo.SetValue(item.Value, innerValue); } else if (statusActionDataInfoBaseInfo.FieldType.Equals(typeof(float))) { float innerValue = EditorGUILayout.FloatField((float)innerValueData); statusActionDataInfoBaseInfo.SetValue(item.Value, innerValue); } else if (statusActionDataInfoBaseInfo.FieldType.Equals(typeof(string))) { string innerValue = EditorGUILayout.TextField((string)innerValueData); statusActionDataInfoBaseInfo.SetValue(item.Value, innerValue); } else if (statusActionDataInfoBaseInfo.FieldType.Equals(typeof(bool))) { bool innerValue = EditorGUILayout.Toggle((bool)innerValueData); statusActionDataInfoBaseInfo.SetValue(item.Value, innerValue); } EditorGUILayout.EndHorizontal(); } } } } } } } } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); } catch { restart = false; } }
private void OnGUI() { EditorGUILayout.BeginHorizontal(); //左侧具体的场景 EditorGUILayout.BeginVertical(GUILayout.Width(135)); if (GUILayout.Button("保存")) { string valueText = SerializeNow(sceneToMapDataDic); File.WriteAllText(dataDirectoryPath + "/Map.txt", valueText, Encoding.UTF8); EditorUtility.DisplayDialog("保存数据", "保存成功!", "确认"); } EditorGUILayout.LabelField("场景名"); tempSceneName = EditorGUILayout.TextField(tempSceneName); if (!string.IsNullOrEmpty(tempSceneName)) { if (!sceneToMapDataDic.ContainsKey(tempSceneName)) { if (GUILayout.Button("添加")) { if (EditorUtility.DisplayDialog("提示!", "是否添加该场景的数据", "确认添加", "取消添加")) { sceneToMapDataDic.Add(tempSceneName, new MapDataInfo()); } } } } EditorGUILayout.Space(); leftScroll = EditorGUILayout.BeginScrollView(leftScroll); KeyValuePair <string, MapDataInfo>[] values = new KeyValuePair <string, MapDataInfo> [0]; if (string.IsNullOrEmpty(tempSceneName)) { values = sceneToMapDataDic.OfType <KeyValuePair <string, MapDataInfo> >().ToArray(); } else { values = sceneToMapDataDic.Where(temp => temp.Key.Contains(tempSceneName)).ToArray(); } foreach (KeyValuePair <string, MapDataInfo> value in values) { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("×", GUILayout.Width(20))) { if (EditorUtility.DisplayDialog("警告!", "是否删除该场景名的数据", "确认删除", "取消删除")) { sceneToMapDataDic.Remove(value.Key); } } string newKey = EditorGUILayout.TextField(value.Key, GUILayout.Width(80)); if (!string.Equals(value.Key, newKey) && !string.IsNullOrEmpty(newKey)) { if (sceneToMapDataDic.ContainsKey(value.Key) && !sceneToMapDataDic.ContainsKey(newKey)) { sceneToMapDataDic.Remove(value.Key); sceneToMapDataDic.Add(newKey, value.Value); } } bool isCheck = object.Equals(tempMapDataInfo, value.Value); isCheck = EditorGUILayout.Toggle(isCheck, GUILayout.Width(25)); if (isCheck) { tempMapDataInfo = value.Value; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); //游戏详细的设置 EditorGUILayout.BeginVertical(); if (tempMapDataInfo != null && sceneToMapDataDic.ContainsValue(tempMapDataInfo)) { string thisSceneName = sceneToMapDataDic.Where(temp => object.Equals(temp.Value, tempMapDataInfo)).Select(temp => temp.Key).FirstOrDefault(); if (!string.IsNullOrEmpty(thisSceneName)) { if (GUILayout.Button("刷新精灵库") && EditorUtility.DisplayDialog("请再次确认", "是否刷新?", "是", "否")) { SpriteManager.Load(); } ReflectUnit <MapDataInfo> mapDataInfoUnit = Entry.On(tempMapDataInfo); //设置场景名 if (!string.Equals(tempMapDataInfo.SceneName, thisSceneName)) { mapDataInfoUnit.Field("sceneName", thisSceneName).End(); } EditorGUILayout.LabelField("场景名:" + tempMapDataInfo.SceneName); //设置边界 Rect sceneRect = EditorGUILayout.RectField("场景边界:", tempMapDataInfo.SceneRect); if (!Rect.Equals(sceneRect, tempMapDataInfo.SceneRect)) { mapDataInfoUnit.Set("SceneRect", sceneRect).End(); } //设置地图图片 tempMapDataInfo.Load(); Sprite mapSprite = (Sprite)EditorGUILayout.ObjectField("场景的地图:", tempMapDataInfo.MapSprite, typeof(Sprite), true); if (!Sprite.Equals(mapSprite, tempMapDataInfo.MapSprite) && mapSprite != null) { string mapSpriteID = SpriteManager.GetName(mapSprite); mapDataInfoUnit.Field("mapSpriteID", mapSpriteID).End(); tempMapDataInfo.Load(true); } } } EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); }
private void OnGUI() { if (levelToDataDic == null) { return; } EditorGUILayout.BeginHorizontal(); //左侧的选择等级按钮面板 EditorGUILayout.BeginVertical(GUILayout.Width(83)); if (GUILayout.Button("保存")) { string valueText = SerializeNow(levelToDataDic); File.WriteAllText(dataDirecotryPath + "/Level.txt", valueText, Encoding.UTF8); EditorUtility.DisplayDialog("保存数据", "保存成功!", "确认"); } leftScroll = EditorGUILayout.BeginScrollView(leftScroll); EditorGUILayout.BeginHorizontal(); int count = levelToDataDic.Count; if (GUILayout.Button("-", GUILayout.Width(18))) { if (EditorUtility.DisplayDialog("警告!", "将会减去最后一个等级的数据!", "确认", "取消")) { count--; } } EditorGUILayout.IntField(count, GUILayout.Width(18)); if (GUILayout.Button("+", GUILayout.Width(18))) { count++; } if (count != levelToDataDic.Count && count >= 0) { if (count > levelToDataDic.Count) { levelToDataDic.Add(levelToDataDic.Count, new LevelDataInfo()); } else { levelToDataDic.Remove(levelToDataDic.Count - 1); } } EditorGUILayout.EndHorizontal(); selectKey = Mathf.Clamp(selectKey, -1, levelToDataDic.Count - 1); for (int i = 0; i < levelToDataDic.Count; i++) { EditorGUILayout.BeginHorizontal(); if (selectKey == i) { GUILayout.Space(20); } if (GUILayout.Button(i.ToString(), GUILayout.Width(40))) { if (selectKey == i) { selectKey = -1; } else { selectKey = i; } } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); //右侧的当前等级对应数据面板 EditorGUILayout.BeginVertical(); if (selectKey > -1 && selectKey < levelToDataDic.Count) { //取出该等级的数据并构建反射单元 LevelDataInfo levelDataInfo = levelToDataDic[selectKey]; ReflectUnit <LevelDataInfo> levelDataInfoUnit = Entry.On(levelDataInfo); //设置该等级 if (levelDataInfo.Level != selectKey) { levelDataInfoUnit.Field("level", selectKey).End(); } EditorGUILayout.LabelField("等级:" + levelDataInfo.Level); //设置升级所需经验 int experience = EditorGUILayout.IntField("升级所需经验:", levelDataInfo.Experience); if (experience != levelDataInfo.Experience) { levelDataInfoUnit.Field("experience", experience).End(); } //设置该等级附加的力量 int strength = EditorGUILayout.IntField("本等级附加的力量:", levelDataInfo.Strength); if (strength != levelDataInfo.Strength) { levelDataInfoUnit.Field("strength", strength).End(); } //设置该等级附加的精神 int spirit = EditorGUILayout.IntField("本等级附加的精神", levelDataInfo.Spirit); if (spirit != levelDataInfo.Spirit) { levelDataInfoUnit.Field("spirit", spirit).End(); } //设置该等级附加的敏捷 int agility = EditorGUILayout.IntField("本等级附加的敏捷", levelDataInfo.Agility); if (agility != levelDataInfo.Agility) { levelDataInfoUnit.Field("agility", agility).End(); } //设置该等级附加的自由点数 int freedomPoint = EditorGUILayout.IntField("本等级附加的自由点数", levelDataInfo.FreedomPoint); if (freedomPoint != levelDataInfo.FreedomPoint) { levelDataInfoUnit.Field("freedomPoint", freedomPoint).End(); } } EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); }