/* * @Author: 白哉 * @Description: 成就 编辑器 * @Date: 2025年04月22日 星期二 15:04:14 * @Modify: */ using System.Collections.Generic; using System.IO; using Logic.Achievement; using Logic.Multilingual; 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 _showItem; private List _itemList; [MenuItem("Tools/成就编辑器")] private static void ShowWindow() { var window = CreateWindow(); 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(); if (!_asset) { var path = $"Assets/BundleResources/DataAssets/Achievement.asset"; _asset = AssetDatabase.LoadAssetAtPath(path); if (!_asset) { _asset = CreateInstance(); 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(); foreach (var key in _showItem.Keys)keys.Add(key); foreach (var key in keys) _showItem[key] = true; } if (InspectorUtils.InspectorButtonWithTextWidth("全不选")) { var keys = new List(); 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(); 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($"筛选:"); InspectorUtils.InspectorTextWidthRich($" 大类序号: "); _bigID = (uint)EditorGUILayout.IntField((int)_bigID, GUILayout.Width(20)); InspectorUtils.InspectorTextWidthRich($" 小类序号: "); _smallID = (uint)EditorGUILayout.IntField((int)_smallID, GUILayout.Width(20)); InspectorUtils.InspectorTextWidthRich($" 类内序号: "); _internalID = (uint)EditorGUILayout.IntField((int)_internalID, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); _itemList = _asset.Data.GetAchievementItemList(_bigID, _smallID, _internalID); var deleteSet = new HashSet(); 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($" 成就ID: {item.ID}"); InspectorUtils.InspectorTextWidthRich($" 名称 "); item.Name = EditorGUILayout.TextField(item.Name, GUILayout.Width(100)); InspectorUtils.InspectorTextWidthRich($" 描述 "); 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(); for (int i = 0; i < item.Conditions.Count; i++) { EditorGUILayout.BeginHorizontal(); var conditionType = item.Conditions[i].GetConditionType(); InspectorUtils.InspectorTextWidthRich($" 条件类型 "); 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($"召唤 n 次特定伟人"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:次数 n "); c1.TargetCount = EditorGUILayout.IntField(c1.TargetCount, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:伟人类型 "); c1.TargetGiant = (GiantType) EditorGUILayout.EnumPopup(c1.TargetGiant, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); } if (condition is BuildWonderConditionCondition c2) { EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"建造 n 次 特定奇观"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:次数 n "); c2.TargetCount = EditorGUILayout.IntField(c2.TargetCount, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:奇观类型 "); c2.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c2.Wonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); } if (condition is WonderInCityConditionCondition c3) { EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"特定奇观 属于 特定城市"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:奇观类型 n "); c3.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c3.Wonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:指定城市 "); c3.TargetCity = (CityLibrary) EditorGUILayout.EnumPopup(c3.TargetCity, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); } if (condition is UnitOnWonderConditionCondition c4) { EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"特定奇观 上有 指定伟人 持续 n 回合"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:奇观类型 n "); c4.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c4.Wonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:指定伟人 "); c4.Giant = (GiantType) EditorGUILayout.EnumPopup(c4.Giant, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数3:回合数 n "); c4.TargetTurns = EditorGUILayout.IntField(c4.TargetTurns, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); } if (condition is AroundBuildingsConditionCondition c5) { EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"特定奇观 周围有 n 个指定 Grid"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:奇观类型 n "); c5.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c5.Wonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:指定数量 n "); c5.TargetCount = EditorGUILayout.IntField(c5.TargetCount, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数3:范围 x "); c5.OffsetX = EditorGUILayout.IntField(c5.OffsetX, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数4:范围 y "); c5.OffsetY = EditorGUILayout.IntField(c5.OffsetY, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数5:海陆层目标 "); c5.Terrain = (TerrainType) EditorGUILayout.EnumPopup(c5.Terrain, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数6:地形层目标 "); c5.Feature = (TerrainFeature) EditorGUILayout.EnumPopup(c5.Feature, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数7:植被层目标 "); c5.Vegetation = (Vegetation) EditorGUILayout.EnumPopup(c5.Vegetation, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数8:资源层+建筑层目标 "); c5.Resource = (ResourceType) EditorGUILayout.EnumPopup(c5.Resource, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); } if (condition is AroundWondersConditionCondition c6) { EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"特定奇观 周围有 n 个 指定奇观"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:奇观类型 n "); c6.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c6.Wonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:指定数量 n "); c6.TargetCount = EditorGUILayout.IntField(c6.TargetCount, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数3:范围 x "); c6.OffsetX = EditorGUILayout.IntField(c6.OffsetX, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数4:范围 y "); c6.OffsetY = EditorGUILayout.IntField(c6.OffsetY, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数5:奇观目标 "); c6.AroundWonder = (WonderLibrary) EditorGUILayout.EnumPopup(c6.AroundWonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); } if (condition is AroundEnemyUnitsConditionCondition c7) { EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"特定奇观 周围有 n 个 敌方单位"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:奇观类型 n "); c7.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c7.Wonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:指定数量 n "); c7.TargetCount = EditorGUILayout.IntField(c7.TargetCount, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数3:范围 x "); c7.OffsetX = EditorGUILayout.IntField(c7.OffsetX, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数4:范围 y "); c7.OffsetY = EditorGUILayout.IntField(c7.OffsetY, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); } if (condition is AroundSelfUnitsConditionCondition c8) { EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"特定奇观 周围有 n 个 友方单位"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:奇观类型 n "); c8.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c8.Wonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:指定数量 n "); c8.TargetCount = EditorGUILayout.IntField(c8.TargetCount, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数3:范围 x "); c8.OffsetX = EditorGUILayout.IntField(c8.OffsetX, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数4:范围 y "); c8.OffsetY = EditorGUILayout.IntField(c8.OffsetY, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); } if (condition is AroundCityGridsConditionCondition c9) { EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"特定奇观 周围有 n 个 指定城市格子"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数1:奇观类型 n "); c9.Wonder = (WonderLibrary) EditorGUILayout.EnumPopup(c9.Wonder, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数2:指定数量 n "); c9.TargetCount = EditorGUILayout.IntField(c9.TargetCount, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数3:范围 x "); c9.OffsetX = EditorGUILayout.IntField(c9.OffsetX, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数4:范围 y "); c9.OffsetY = EditorGUILayout.IntField(c9.OffsetY, GUILayout.Width(20)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($" 参数5:指定城市 n "); c9.TargetCity = (CityLibrary) EditorGUILayout.EnumPopup(c9.TargetCity, GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); } } } }