TH1/Unity/Assets/Scripts/TH1_Logic/Editor/AchievementEditorWindow.cs
2026-05-11 01:06:16 +08:00

543 lines
26 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 System.IO;
using Logic.Achievement;
using Logic.Multilingual;
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);
}
}*/
/*
这条是这样的我在填表是数据1 导出为数据2 ,本地会存json数据3只有数据3的json存玩家的成就完成情况当时3的json污染了1的json所以用这个来清理1的json
if (InspectorUtils.InspectorButtonWithTextWidth("玩家成就情况清零"))
{
foreach (var item in _asset.Data.AchievementList)
{
foreach(var cond in item.Conditions)
cond.ClearUserData();
}
}*/
if (InspectorUtils.InspectorButtonWithTextWidth("清空成就完成情况"))
{
string path = Application.persistentDataPath + "/../Config/achievement.json";
if (File.Exists(path))File.Delete(path);
}
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));
}
/*
这个是本地填表数据丢了用json信息导回1用的。注意会使得1的json数据被3污染
if (Application.isPlaying && InspectorUtils.InspectorButtonWithTextWidth("json导回本地"))
{
_asset.Data = AchievementDataManager.Instance.Achievement;
foreach (var item in _asset.Data.AchievementList)
{
item.Name = MultilingualManager.Instance.GetMultilingualText(uint.Parse(item.Name));
item.Desc = MultilingualManager.Instance.GetMultilingualText(uint.Parse(item.Desc));
}
}*/
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.FrenchTewi);
giantList.Add(GiantType.FrenchReisen);
giantList.Add(GiantType.FrenchMokou);
// 顺序必须严格对应棋种 King/Queen/Bishop/Knight/Rook
// 否则 GetSmallIdByGiantType (基于 LibraryDataAssets.AchivePreId%100) 与本批量生成的 SmallID 会错位
giantList.Add(GiantType.GermanyKanako);
giantList.Add(GiantType.GermanySuwako);
giantList.Add(GiantType.GermanySanae);
giantList.Add(GiantType.GermanyAya); // Knight
giantList.Add(GiantType.GermanyMomiji); // Rook
giantList.Add(GiantType.IndianSatori);
giantList.Add(GiantType.IndianKoishi);
giantList.Add(GiantType.IndianRin);
giantList.Add(GiantType.IndianUtsuho); // Knight
giantList.Add(GiantType.IndianYuugi); // Rook
for (int i = 0; i < giantList.Count; i++)
{
for (int k = 1; k <= 3; k++)
{
var item = new AchievementItem();
item.BigID = 2;
item.SmallID = (uint)i + 1;
item.InternalID = (uint)k;
if (_asset.Data.GetAchievementItem(item.BigID, item.SmallID, item.InternalID) != null) continue;
var condition = new TrainGiantCondition();
condition.TargetCount = 10 * k;
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*j;
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();
}
}
}
}