using UnityEditor; using UnityEngine; using System.Collections.Generic; using System.Linq; using Logic.Action; using Unity.VisualScripting; public static class DeepCopier { /// /// 对一个Unity可序列化的对象进行深拷贝 /// /// 对象类型 /// 源对象

/// 一个全新的对象副本 public static T DeepCopy(T source) { // 1. 将对象序列化为JSON字符串 string json = JsonUtility.ToJson(source); // 2. 将JSON字符串反序列化为一个全新的对象 return JsonUtility.FromJson(json); } } public class TechToTechAtomDataAssetFiller { [MenuItem("填表脚本/Tech所有Action转化为TechAtom")] public static void FillMissingCivSprites() { string assetPath = "Assets/BundleResources/DataAssets/TechDataAssets.asset"; var asset = AssetDatabase.LoadAssetAtPath(assetPath); string actionAssetPath = "Assets/BundleResources/DataAssets/ActionDataAssets.asset"; var actionAsset = AssetDatabase.LoadAssetAtPath(actionAssetPath); if (asset == null) { Debug.LogError("❌ 找不到 UnitTypeDataAssets.asset,请确认路径正确!"); return; } int addCount = 0; foreach (var techInfo in asset.TechList) { var actionList = techInfo.GetActionList(); foreach (var action in actionList) { if (action.ActionType is CommonActionType.UnitSkill or CommonActionType.UnitAction or CommonActionType.TrainUnit or CommonActionType.BuildWonder or CommonActionType.StartWonder or CommonActionType.Gain or CommonActionType.Build or CommonActionType.GridMisc) { //Debug.Log(action.SkillType); var str = ""; if(action.ActionType is CommonActionType.UnitSkill) str = "UnitSkill" + action.SkillType.ToString(); if(action.ActionType is CommonActionType.UnitAction) str = action.UnitActionType.ToString(); if(action.ActionType is CommonActionType.TrainUnit) str = "TrainUnit" + action.UnitType.ToString(); if(action.ActionType is CommonActionType.StartWonder) str = "StartWonder" + action.WonderType.ToString(); if(action.ActionType is CommonActionType.BuildWonder) str = "BuildWonder" + action.WonderType.ToString(); if(action.ActionType is CommonActionType.Gain) str = "Gain" + action.ResourceType.ToString(); if(action.ActionType is CommonActionType.Build) str = "Build" + action.ResourceType.ToString(); if(action.ActionType is CommonActionType.GridMisc) str = action.GridMiscActionType.ToString(); var has = false; foreach(var techAtom in asset.TechAtomList) if (techAtom.TechAtom.ToString() == str) { has = true; break; } if (!has) { var info = new TechAtomInfo(); if (TechAtom.TryParse(str, out info.TechAtom)) { foreach (var actionInfo in actionAsset.ActionList) { if (actionInfo.ActionId == action) { info.TechAtomName = actionInfo.ActionName; info.Desc = actionInfo.NeedTechDesc ? actionInfo.TechDesc : actionInfo.Desc; } } asset.TechAtomList.Add(info); addCount++; } } else { foreach(var techAtomInfo in asset.TechAtomList) if (techAtomInfo.TechAtom.ToString() == str) { foreach (var actionInfo in actionAsset.ActionList) { if (actionInfo.ActionId == action) { if(techAtomInfo.IconContainer.Icon == null) techAtomInfo.IconContainer.Icon = actionInfo.Icon; if (actionInfo.VarientIcon && !techAtomInfo.IconContainer.IsVarient) { techAtomInfo.IconContainer.IsVarient = actionInfo.VarientIcon; techAtomInfo.IconContainer.IconList.Clear(); foreach (var t in actionInfo.IconList) { EmpireGridSpInfoPack newItem = DeepCopier.DeepCopy(t); techAtomInfo.IconContainer.IconList.Add(newItem); } } } } } //asset.TechAtomList.Add(info); } if (TechAtom.TryParse(str, out TechAtom techAtom2)) { bool alreadyHas = false; foreach(var techAtom in techInfo.TechAtomList) if (techAtom == techAtom2) { alreadyHas = true; break; } if (!alreadyHas) { techInfo.TechAtomList.Add(techAtom2); } } } } } asset.TechAtomList.Sort((a, b) => a.TechAtom.CompareTo(b.TechAtom)); EditorUtility.SetDirty(asset); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log($"✅ 补全完成:共添加了 {addCount} 个 TechAtom 条目。"); } }