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 条目。");
}
}