TH1/Unity/Assets/Scripts/TH1_Logic/Editor/MatchConfigEditorWindow.cs
2026-01-22 17:29:58 +08:00

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;
}
}
}