TH1/My project/Assets/Scripts/Logic/Editor/AchievementEditorWindow.cs
2025-07-16 17:16:18 +08:00

514 lines
24 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: 白哉
* @Description: 成就 编辑器
* @Date: 2025年04月22日 星期二 15:04:14
* @Modify:
*/
using System.Collections.Generic;
using Logic.Achievement;
using NUnit.Framework;
using RuntimeData;
using UnityEditor;
using UnityEngine;
namespace Logic.Editor
{
public class AchievementEditorWindow : EditorWindow
{
// 滑条
private Vector2 _barPosition;
// 背景
private GUIStyle _redBoxStyle;
private GUIStyle _whiteBoxStyle;
private AchievementAsset _asset;
private uint _bigID;
private uint _smallID;
private uint _internalID;
private Dictionary<uint, bool> _showItem;
private List<AchievementItem> _itemList;
[MenuItem("Tools/成就编辑器")]
private static void ShowWindow()
{
var window = CreateWindow<AchievementEditorWindow>();
window.titleContent = new GUIContent("成就编辑器");
window.Show();
window.minSize = new Vector2(500, 600);
}
protected virtual void OnEnable()
{
}
private void OnDisable()
{
}
private void OnGUI()
{
_showItem ??= new Dictionary<uint, bool>();
if (!_asset)
{
var path = $"Assets/Resources/DataAssets/Achievement.asset";
_asset = AssetDatabase.LoadAssetAtPath<AchievementAsset>(path);
if (!_asset)
{
_asset = CreateInstance<AchievementAsset>();
AssetDatabase.CreateAsset(_asset, path);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
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();
if (InspectorUtils.InspectorButtonWithTextWidth("保存"))
{
EditorUtility.SetDirty(_asset);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
if (InspectorUtils.InspectorButtonWithTextWidth("清空"))
{
foreach (var item in _itemList)
{
_asset.Data.AchievementList.Remove(item);
}
}
if (Application.isPlaying && InspectorUtils.InspectorButtonWithTextWidth("清空成就完成情况(运行时)"))
{
AchievementDataManager.Instance.Achievement.ClearAchievementFinishedInfo();
AchievementDataManager.Instance.SaveAchievementData();
}
if (_bigID != 0 && _smallID != 0)
{
if (InspectorUtils.InspectorButtonWithTextWidth("增加一条成就"))
{
_asset.Data.AddNewAchievementItem(_bigID, _smallID);
}
}
if (InspectorUtils.InspectorButtonWithTextWidth("刷新排序"))
{
_asset.Data.AchievementList.Sort((a, b) => a.ID.CompareTo(b.ID));
}
if (InspectorUtils.InspectorButtonWithTextWidth("全选"))
{
var keys = new List<uint>();
foreach (var key in _showItem.Keys)keys.Add(key);
foreach (var key in keys) _showItem[key] = true;
}
if (InspectorUtils.InspectorButtonWithTextWidth("全不选"))
{
var keys = new List<uint>();
foreach (var key in _showItem.Keys)keys.Add(key);
foreach (var key in keys) _showItem[key] = false;
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth("批量创建伟人成就"))
{
var giantList = new List<GiantType>();
giantList.Add(GiantType.EgyptianRemilia);
giantList.Add(GiantType.EgyptianPatchouli);
giantList.Add(GiantType.EgyptianSakuya);
giantList.Add(GiantType.EgyptianFlandre);
giantList.Add(GiantType.EgyptianMeiling);
giantList.Add(GiantType.FrenchKaguya);
giantList.Add(GiantType.FrenchEirin);
giantList.Add(GiantType.FrenchInaba);
giantList.Add(GiantType.FrenchReisen);
giantList.Add(GiantType.FrenchMokou);
giantList.Add(GiantType.GermanyKanako);
giantList.Add(GiantType.GermanySuwako);
giantList.Add(GiantType.GermanySanae);
giantList.Add(GiantType.GermanyAya);
giantList.Add(GiantType.GermanyNitori);
giantList.Add(GiantType.IndianSatori);
giantList.Add(GiantType.IndianKoishi);
giantList.Add(GiantType.IndianRin);
giantList.Add(GiantType.IndianYuugi);
giantList.Add(GiantType.IndianUtsuho);
for (int i = 0; i < giantList.Count; i++)
{
var item = new AchievementItem();
item.BigID = 1;
item.SmallID = (uint)(i / 5 + 1);
item.InternalID = (uint)(i % 5 + 1);
if (_asset.Data.GetAchievementItem(item.BigID, item.SmallID, item.InternalID) != null) continue;
var condition = new TrainGiantCondition();
condition.TargetCount = 1;
condition.TargetGiant = giantList[i];
item.Conditions.Add(condition);
_asset.Data.AchievementList.Add(item);
_asset.Data.AchievementList.Sort((a, b) => a.ID.CompareTo(b.ID));
_asset.Data.RefreshAchievementDict();
}
}
if (InspectorUtils.InspectorButtonWithTextWidth("批量创建奇观成就"))
{
for (int i = (int)WonderLibrary.EgyptianRemiliaPEACE; i <= (int)WonderLibrary.IndianSatoriEYE; i++)
for(int j = 1;j <= 3;j++)
{
var item = new AchievementItem();
item.BigID = 3;
item.SmallID = (uint)(i + 1);
item.InternalID = (uint)j;
if (_asset.Data.GetAchievementItem(item.BigID, item.SmallID, item.InternalID) != null) continue;
var condition = new BuildWonderConditionCondition();
condition.TargetCount = 10;
condition.Wonder = (WonderLibrary)i;
item.Conditions.Add(condition);
_asset.Data.AchievementList.Add(item);
_asset.Data.AchievementList.Sort((a, b) => a.ID.CompareTo(b.ID));
_asset.Data.RefreshAchievementDict();
}
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>筛选:</b>");
InspectorUtils.InspectorTextWidthRich($"<b> 大类序号: </b>");
_bigID = (uint)EditorGUILayout.IntField((int)_bigID, GUILayout.Width(20));
InspectorUtils.InspectorTextWidthRich($"<b> 小类序号: </b>");
_smallID = (uint)EditorGUILayout.IntField((int)_smallID, GUILayout.Width(20));
InspectorUtils.InspectorTextWidthRich($"<b> 类内序号: </b>");
_internalID = (uint)EditorGUILayout.IntField((int)_internalID, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
_itemList = _asset.Data.GetAchievementItemList(_bigID, _smallID, _internalID);
var deleteSet = new HashSet<AchievementItem>();
foreach (var item in _itemList)
{
if (OnGUIAchievementItem(item)) deleteSet.Add(item);
EditorGUILayout.Space();
}
foreach (var item in deleteSet)
{
_showItem.Remove(item.ID);
_asset.Data.AchievementList.Remove(item);
}
EditorGUILayout.EndScrollView();
}
private bool OnGUIAchievementItem(AchievementItem item)
{
bool isDelete = false;
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
EditorGUILayout.BeginHorizontal();
var isShow = false;
if (_showItem.TryGetValue(item.ID, out var value)) isShow = value;
isShow = EditorGUILayout.Toggle(isShow, GUILayout.Width(16));
_showItem[item.ID] = isShow;
InspectorUtils.InspectorTextWidthRich($"<b> 成就ID: {item.ID}</b>");
InspectorUtils.InspectorTextWidthRich($"<b> 名称 </b>");
item.Name = EditorGUILayout.TextField(item.Name, GUILayout.Width(100));
InspectorUtils.InspectorTextWidthRich($"<b> 描述 </b>");
item.Desc = EditorGUILayout.TextField(item.Desc, GUILayout.Width(300));
if (InspectorUtils.InspectorButtonWithTextWidth("+"))
{
item.Conditions.Add(AchievementFactory.GetAchievementCondition(AchievementConditionType.AroundBuildings));
}
if (InspectorUtils.InspectorButtonWithTextWidth("x")) isDelete = true;
EditorGUILayout.EndHorizontal();
if (isShow)
{
var deleteSet = new HashSet<AchievementConditionBase>();
for (int i = 0; i < item.Conditions.Count; i++)
{
EditorGUILayout.BeginHorizontal();
var conditionType = item.Conditions[i].GetConditionType();
InspectorUtils.InspectorTextWidthRich($"<b> 条件类型 </b>");
conditionType = (AchievementConditionType) EditorGUILayout.EnumPopup( conditionType, GUILayout.Width(150));
if (conditionType != item.Conditions[i].GetConditionType())
item.Conditions[i] = AchievementFactory.GetAchievementCondition(conditionType);
if (InspectorUtils.InspectorButtonWithTextWidth("x")) deleteSet.Add(item.Conditions[i]);
EditorGUILayout.EndHorizontal();
OnGUIAchievementICondition(item.Conditions[i]);
EditorGUILayout.Space();
}
foreach (var condition in deleteSet) item.Conditions.Remove(condition);
}
EditorGUILayout.EndVertical();
return isDelete;
}
private void OnGUIAchievementICondition(AchievementConditionBase condition)
{
if (condition is TrainGiantCondition c1)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>召唤 n 次特定伟人</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1次数 n </b>");
c1.TargetCount = EditorGUILayout.IntField(c1.TargetCount, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2伟人类型 </b>");
c1.TargetGiant = (GiantType) EditorGUILayout.EnumPopup(c1.TargetGiant, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
}
if (condition is BuildWonderConditionCondition c2)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>建造 n 次 特定奇观</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1次数 n </b>");
c2.TargetCount = EditorGUILayout.IntField(c2.TargetCount, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2奇观类型 </b>");
c2.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c2.Wonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
}
if (condition is WonderInCityConditionCondition c3)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>特定奇观 属于 特定城市</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1奇观类型 n </b>");
c3.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c3.Wonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2指定城市 </b>");
c3.TargetCity = (CityLibrary) EditorGUILayout.EnumPopup(c3.TargetCity, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
}
if (condition is UnitOnWonderConditionCondition c4)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>特定奇观 上有 指定伟人 持续 n 回合</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1奇观类型 n </b>");
c4.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c4.Wonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2指定伟人 </b>");
c4.Giant = (GiantType) EditorGUILayout.EnumPopup(c4.Giant, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数3回合数 n </b>");
c4.TargetTurns = EditorGUILayout.IntField(c4.TargetTurns, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
}
if (condition is AroundBuildingsConditionCondition c5)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>特定奇观 周围有 n 个指定 Grid</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1奇观类型 n </b>");
c5.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c5.Wonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2指定数量 n </b>");
c5.TargetCount = EditorGUILayout.IntField(c5.TargetCount, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数3范围 x </b>");
c5.OffsetX = EditorGUILayout.IntField(c5.OffsetX, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数4范围 y </b>");
c5.OffsetY = EditorGUILayout.IntField(c5.OffsetY, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数5海陆层目标 </b>");
c5.Terrain = (TerrainType) EditorGUILayout.EnumPopup(c5.Terrain, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数6地形层目标 </b>");
c5.Feature = (TerrainFeature) EditorGUILayout.EnumPopup(c5.Feature, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数7植被层目标 </b>");
c5.Vegetation = (Vegetation) EditorGUILayout.EnumPopup(c5.Vegetation, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数8资源层+建筑层目标 </b>");
c5.Resource = (ResourceType) EditorGUILayout.EnumPopup(c5.Resource, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
}
if (condition is AroundWondersConditionCondition c6)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>特定奇观 周围有 n 个 指定奇观</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1奇观类型 n </b>");
c6.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c6.Wonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2指定数量 n </b>");
c6.TargetCount = EditorGUILayout.IntField(c6.TargetCount, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数3范围 x </b>");
c6.OffsetX = EditorGUILayout.IntField(c6.OffsetX, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数4范围 y </b>");
c6.OffsetY = EditorGUILayout.IntField(c6.OffsetY, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数5奇观目标 </b>");
c6.AroundWonder = (WonderLibrary) EditorGUILayout.EnumPopup(c6.AroundWonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
}
if (condition is AroundEnemyUnitsConditionCondition c7)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>特定奇观 周围有 n 个 敌方单位</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1奇观类型 n </b>");
c7.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c7.Wonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2指定数量 n </b>");
c7.TargetCount = EditorGUILayout.IntField(c7.TargetCount, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数3范围 x </b>");
c7.OffsetX = EditorGUILayout.IntField(c7.OffsetX, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数4范围 y </b>");
c7.OffsetY = EditorGUILayout.IntField(c7.OffsetY, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
}
if (condition is AroundSelfUnitsConditionCondition c8)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>特定奇观 周围有 n 个 友方单位</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1奇观类型 n </b>");
c8.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c8.Wonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2指定数量 n </b>");
c8.TargetCount = EditorGUILayout.IntField(c8.TargetCount, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数3范围 x </b>");
c8.OffsetX = EditorGUILayout.IntField(c8.OffsetX, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数4范围 y </b>");
c8.OffsetY = EditorGUILayout.IntField(c8.OffsetY, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
}
if (condition is AroundCityGridsConditionCondition c9)
{
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>特定奇观 周围有 n 个 指定城市格子</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数1奇观类型 n </b>");
c9.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c9.Wonder, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数2指定数量 n </b>");
c9.TargetCount = EditorGUILayout.IntField(c9.TargetCount, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数3范围 x </b>");
c9.OffsetX = EditorGUILayout.IntField(c9.OffsetX, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数4范围 y </b>");
c9.OffsetY = EditorGUILayout.IntField(c9.OffsetY, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b> 参数5指定城市 n </b>");
c9.TargetCity = (CityLibrary) EditorGUILayout.EnumPopup(c9.TargetCity, GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
}
}
}
}