305 lines
12 KiB
C#
305 lines
12 KiB
C#
/*
|
|
* @Author: 白哉
|
|
* @Description: 编辑器
|
|
* @Date: 2025年04月22日 星期二 15:04:14
|
|
* @Modify:
|
|
*/
|
|
|
|
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using Logic.Achievement;
|
|
using Logic.AI;
|
|
using Logic.CrashSight;
|
|
using Logic.HeroTask;
|
|
using Logic.Multilingual;
|
|
using NUnit.Framework;
|
|
using RuntimeData;
|
|
using TH1_Logic.Core;
|
|
using TH1_Logic.HeroTask;
|
|
using TH1_Logic.MatchConfig;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
|
|
namespace Logic.Editor
|
|
{
|
|
public class MatchConfigEditorWindow : EditorWindow
|
|
{
|
|
// 滑条
|
|
private Vector2 _barPosition;
|
|
|
|
// 背景
|
|
private GUIStyle _redBoxStyle;
|
|
private GUIStyle _whiteBoxStyle;
|
|
|
|
private List<string> _levelStrList;
|
|
private uint _selectedId;
|
|
private List<string> _mapNameList;
|
|
private string _selectedMapName;
|
|
private uint _newConfigId = 1;
|
|
|
|
|
|
[MenuItem("Tools/关卡编辑器")]
|
|
private static void ShowWindow()
|
|
{
|
|
var window = CreateWindow<MatchConfigEditorWindow>();
|
|
window.titleContent = new GUIContent("关卡编辑器");
|
|
window.Show();
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
_levelStrList = new List<string>();
|
|
_mapNameList = new List<string>();
|
|
MatchConfigManager.Instance.Init();
|
|
RefreshMapNameList();
|
|
}
|
|
|
|
private void OnGUI()
|
|
{
|
|
if (_redBoxStyle == null)
|
|
{
|
|
_redBoxStyle = InspectorUtils.GetHelpBoxStyle();
|
|
InspectorUtils.AddBorder(_redBoxStyle, new Color(0.5f, 0.4f, 0.4f, 0.6f));
|
|
}
|
|
if (_whiteBoxStyle == null)
|
|
{
|
|
_whiteBoxStyle = InspectorUtils.GetHelpBoxStyle();
|
|
InspectorUtils.AddBorder(_whiteBoxStyle, new Color(1f, 1f, 1f, 0.2f));
|
|
}
|
|
|
|
GUI.skin.button.wordWrap = true;
|
|
_barPosition = EditorGUILayout.BeginScrollView(_barPosition);
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
_newConfigId = (uint)EditorGUILayout.IntField((int)_newConfigId, GUILayout.Width(300));
|
|
if (InspectorUtils.InspectorButtonWithTextWidth("新增关卡"))
|
|
{
|
|
MatchConfigManager.Instance.AddMatchConfig(_newConfigId);
|
|
}
|
|
if (InspectorUtils.InspectorButtonWithTextWidth("刷新"))
|
|
{
|
|
RefreshMapNameList();
|
|
}
|
|
if (InspectorUtils.InspectorButtonWithTextWidth("保存"))
|
|
{
|
|
MatchConfigManager.Instance.SaveMatchLevelData();
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich($"<b> 选择关卡 : </b>");
|
|
var index = GetIndexInLevelList(_selectedId);
|
|
index = EditorGUILayout.Popup(index, _levelStrList.ToArray(), GUILayout.Width(300));
|
|
if (_levelStrList.Count != 0) _selectedId = uint.TryParse(_levelStrList[index], out var id) ? id : 0;
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.Space();
|
|
var mapConfig = MatchConfigManager.Instance.GetMatchConfig(_selectedId);
|
|
if(mapConfig != null) OnGUIMapConfig(mapConfig);
|
|
EditorGUILayout.EndScrollView();
|
|
}
|
|
|
|
private void OnGUIMapConfig(MapConfig mapConfig)
|
|
{
|
|
EditorGUILayout.BeginVertical(_redBoxStyle);
|
|
|
|
// 基础配置
|
|
if (InspectorUtils.InspectorButtonWithTextWidth("删除关卡"))
|
|
{
|
|
if (EditorUtility.DisplayDialog("确认删除", $"确定要删除关卡 {mapConfig.Id} 吗?", "确定", "取消"))
|
|
{
|
|
MatchConfigManager.Instance.LevelData.LevelConfigs.Remove(mapConfig.Id);
|
|
_selectedId = 0;
|
|
}
|
|
}
|
|
InspectorUtils.InspectorTextWidthRich("<b>基础配置</b>");
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("关卡ID:");
|
|
mapConfig.Id = (uint)EditorGUILayout.IntField((int)mapConfig.Id, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("地图宽度:");
|
|
mapConfig.Width = (uint)EditorGUILayout.IntField((int)mapConfig.Width, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("地图高度:");
|
|
mapConfig.Height = (uint)EditorGUILayout.IntField((int)mapConfig.Height, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("玩家数量:");
|
|
mapConfig.PlayerCount = (uint)EditorGUILayout.IntField((int)mapConfig.PlayerCount, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("AI难度:");
|
|
mapConfig.AIDiff = (AIDifficult)EditorGUILayout.EnumPopup(mapConfig.AIDiff, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
// 单机配置
|
|
InspectorUtils.InspectorTextWidthRich("<b>单机配置</b>");
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("文明ID:");
|
|
mapConfig.selfCivId = (uint)EditorGUILayout.IntField((int)mapConfig.selfCivId, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("势力ID:");
|
|
mapConfig.selfForceId = (uint)EditorGUILayout.IntField((int)mapConfig.selfForceId, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.Space(10);
|
|
|
|
// 地图配置
|
|
InspectorUtils.InspectorTextWidthRich("<b>地图配置</b>");
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("自定义地图:");
|
|
mapConfig.IsCustomMap = EditorGUILayout.Toggle(mapConfig.IsCustomMap, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (mapConfig.IsCustomMap)
|
|
{
|
|
EditorGUILayout.BeginHorizontal();
|
|
if (_mapNameList.Count == 0) InspectorUtils.InspectorTextWidthRich("无地图可用");
|
|
else
|
|
{
|
|
InspectorUtils.InspectorTextWidthRich("地图名称:");
|
|
var mapIndex = GetIndexInMapNameList(mapConfig.MapName);
|
|
mapIndex = EditorGUILayout.Popup(mapIndex, _mapNameList.ToArray(), GUILayout.Width(200));
|
|
if (mapIndex >= 0 && mapIndex < _mapNameList.Count)
|
|
{
|
|
mapConfig.MapName = _mapNameList[mapIndex];
|
|
}
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
}
|
|
|
|
EditorGUILayout.Space(10);
|
|
|
|
// 结算配置
|
|
InspectorUtils.InspectorTextWidthRich("<b>结算配置</b>");
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("对局结算类型:");
|
|
mapConfig.MatchSettlement = (MatchSettlementType)EditorGUILayout.EnumPopup(mapConfig.MatchSettlement, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("玩家结算类型:");
|
|
mapConfig.PlayerSettlement = (PlayerSettlementType)EditorGUILayout.EnumPopup(mapConfig.PlayerSettlement, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (mapConfig.Tasks == null) mapConfig.Tasks = new List<PlayerTaskInfo>();
|
|
EditorGUILayout.BeginHorizontal();
|
|
if (InspectorUtils.InspectorButtonWithTextWidth("添加任务"))
|
|
{
|
|
var newTask = new PlayerTaskInfo();
|
|
mapConfig.Tasks.Add(newTask);
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.Space(5);
|
|
|
|
// 显示所有任务
|
|
var deleteIndex = -1;
|
|
for (int i = 0; i < mapConfig.Tasks.Count; i++)
|
|
{
|
|
if(OnGUITask(mapConfig.Tasks[i])) deleteIndex = i;
|
|
EditorGUILayout.Space(5);
|
|
}
|
|
if (deleteIndex >= 0) mapConfig.Tasks.RemoveAt(deleteIndex);
|
|
|
|
EditorGUILayout.EndVertical();
|
|
}
|
|
|
|
private bool OnGUITask(PlayerTaskInfo taskInfo)
|
|
{
|
|
EditorGUILayout.BeginVertical(_whiteBoxStyle);
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("任务类型:");
|
|
taskInfo.TaskType = (PlayerTaskType)EditorGUILayout.EnumPopup(taskInfo.TaskType, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich($"<b> 描述: {PlayerTaskLogicFactory.GetPlayerTaskTypeDesc(taskInfo.TaskType)} </b> ");
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("参数1:");
|
|
taskInfo.Param1 = EditorGUILayout.IntField(taskInfo.Param1, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("参数2:");
|
|
taskInfo.Param2 = EditorGUILayout.IntField(taskInfo.Param2, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("参数3:");
|
|
taskInfo.Param3 = EditorGUILayout.IntField(taskInfo.Param3, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
InspectorUtils.InspectorTextWidthRich("参数4:");
|
|
taskInfo.Param4 = (UnitType)EditorGUILayout.EnumPopup(taskInfo.Param4, GUILayout.Width(200));
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
bool isDelete = InspectorUtils.InspectorButtonWithTextWidth("删除");
|
|
EditorGUILayout.EndVertical();
|
|
return isDelete;
|
|
}
|
|
|
|
private int GetIndexInLevelList(uint id)
|
|
{
|
|
if (_levelStrList == null) return 0;
|
|
if (_levelStrList.Count != MatchConfigManager.Instance.LevelData.LevelConfigs.Count)
|
|
{
|
|
_levelStrList.Clear();
|
|
foreach (var kv in MatchConfigManager.Instance.LevelData.LevelConfigs)
|
|
{
|
|
_levelStrList.Add(kv.Value.Id.ToString());
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < _levelStrList.Count; i++)
|
|
{
|
|
if (_levelStrList[i] == id.ToString()) return i;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private void RefreshMapNameList()
|
|
{
|
|
_mapNameList ??= new List<string>();
|
|
_mapNameList.Clear();
|
|
string folderPath = "Assets/Resources/MapRecord";
|
|
if (!Directory.Exists(folderPath)) Directory.CreateDirectory(folderPath);
|
|
|
|
string[] files = Directory.GetFiles(folderPath, "*.bytes");
|
|
foreach (string file in files)
|
|
{
|
|
string fileName = Path.GetFileNameWithoutExtension(file);
|
|
if (!string.IsNullOrEmpty(fileName))
|
|
{
|
|
_mapNameList.Add(fileName);
|
|
}
|
|
}
|
|
|
|
LogSystem.LogInfo($"Init: 扫描完成,找到 {_mapNameList.Count} 个地图记录");
|
|
}
|
|
|
|
private int GetIndexInMapNameList(string mapName)
|
|
{
|
|
if (_mapNameList == null) return 0;
|
|
for (int i = 0; i < _mapNameList.Count; i++)
|
|
{
|
|
if (_mapNameList[i] == mapName) return i;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
} |