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;
        }
    }
예제 #2
0
    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();
    }