兼容性替换工具
This commit is contained in:
parent
1ba9269d1c
commit
21d6063290
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e745b95dbce117b48b4bd17df06ed302
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[CreateAssetMenu(fileName = "CrossMapCfg", menuName = "Tools/AxiPrefabCachec", order = 0)]
|
||||||
|
public class AxiPrefabCache : ScriptableObject
|
||||||
|
{
|
||||||
|
public List<AxiPrefabCache_Com2GUID> caches = new List<AxiPrefabCache_Com2GUID>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class AxiPrefabCache_Com2GUID
|
||||||
|
{
|
||||||
|
public string SrcFullName;
|
||||||
|
public string SrcName;
|
||||||
|
public string GUID;
|
||||||
|
public string ToName;
|
||||||
|
public string ToPATH;
|
||||||
|
public string ToGUID;
|
||||||
|
public MonoScript monoScript;
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 47ae96bfd5393694da28c22ab2ccfb7c
|
@ -0,0 +1,203 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditorInternal;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class PrefabComponentLister : EditorWindow
|
||||||
|
{
|
||||||
|
static string cachecfgPath = "Assets/AxiComToolCache.asset";
|
||||||
|
static string outCsDir = Application.dataPath + "/AxiCom/";
|
||||||
|
static Dictionary<string, AxiPrefabCache_Com2GUID> ComType2GUID = new Dictionary<string, AxiPrefabCache_Com2GUID>();
|
||||||
|
|
||||||
|
[MenuItem("移植工具/[1]采集所有预制体下的UGUI组件")]
|
||||||
|
public static void Part1()
|
||||||
|
{
|
||||||
|
ComType2GUID.Clear();
|
||||||
|
string[] prefabGuids = AssetDatabase.FindAssets("t:Prefab");
|
||||||
|
foreach (string guid in prefabGuids)
|
||||||
|
{
|
||||||
|
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||||||
|
GetPrefab(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
AxiPrefabCache cache = ScriptableObject.CreateInstance<AxiPrefabCache>();
|
||||||
|
foreach (var data in ComType2GUID)
|
||||||
|
cache.caches.Add(data.Value);
|
||||||
|
AssetDatabase.CreateAsset(cache, cachecfgPath);
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
static void GetPrefab(string path)
|
||||||
|
{
|
||||||
|
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
|
||||||
|
LoopPrefabNode(path, prefab.gameObject, 0);
|
||||||
|
}
|
||||||
|
static void LoopPrefabNode(string rootPath, GameObject trans, int depth)
|
||||||
|
{
|
||||||
|
string nodename = $"{rootPath}>{trans.name}";
|
||||||
|
|
||||||
|
GameObject prefabRoot = trans.gameObject;
|
||||||
|
int comCount = prefabRoot.GetComponentCount();
|
||||||
|
for (int i = 0; i < comCount; i++)
|
||||||
|
{
|
||||||
|
var com = prefabRoot.GetComponentAtIndex(i);
|
||||||
|
MonoBehaviour monoCom = com as MonoBehaviour;
|
||||||
|
if (monoCom == null)
|
||||||
|
continue;
|
||||||
|
Type monoType = monoCom.GetType();
|
||||||
|
if (!monoType.FullName.Contains("UnityEngine.UI"))
|
||||||
|
continue;
|
||||||
|
// 获取MonoScript资源
|
||||||
|
MonoScript monoScript = MonoScript.FromMonoBehaviour(monoCom);
|
||||||
|
if (monoScript != null)
|
||||||
|
{
|
||||||
|
// 获取MonoScript资源的GUID
|
||||||
|
string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(monoScript));
|
||||||
|
Debug.Log($"{nodename} | <color=#FFF333>[{monoType.Name}]</color> <color=#FF0000>{guid}</color><color=#00FF00>({monoType.FullName})</color>");
|
||||||
|
ComType2GUID[monoType.FullName] =
|
||||||
|
new AxiPrefabCache_Com2GUID()
|
||||||
|
{
|
||||||
|
SrcFullName = monoType.FullName,
|
||||||
|
SrcName = monoType.Name,
|
||||||
|
GUID = guid,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("!!!! 没得");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//遍历
|
||||||
|
foreach (Transform child in trans.transform)
|
||||||
|
LoopPrefabNode(nodename, child.gameObject, depth + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("移植工具/[2]生成中间脚本代码")]
|
||||||
|
public static void Part2()
|
||||||
|
{
|
||||||
|
if (Directory.Exists(outCsDir))
|
||||||
|
Directory.Delete(outCsDir);
|
||||||
|
Directory.CreateDirectory(outCsDir);
|
||||||
|
AxiPrefabCache cache = AssetDatabase.LoadAssetAtPath<AxiPrefabCache>(cachecfgPath);
|
||||||
|
foreach (var data in cache.caches)
|
||||||
|
{
|
||||||
|
string toName = "Axi" + data.SrcName;
|
||||||
|
string toPath = outCsDir + toName + ".cs";
|
||||||
|
string codeStr = "using UnityEngine.UI; public class " + toName + " : " + data.SrcName + " {}";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllText(toPath, codeStr);
|
||||||
|
data.ToName = toName;
|
||||||
|
data.ToPATH = toPath;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.LogError("写入失败" + ex.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Debug.Log("写入完毕");
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("移植工具/[3]收集生成的脚本")]
|
||||||
|
public static void Part3()
|
||||||
|
{
|
||||||
|
AxiPrefabCache cache = AssetDatabase.LoadAssetAtPath<AxiPrefabCache>(cachecfgPath);
|
||||||
|
List<MonoScript> allMonoScripts = FindAllAssetsOfType<MonoScript>();
|
||||||
|
foreach (var data in cache.caches)
|
||||||
|
{
|
||||||
|
MonoScript monoScript = allMonoScripts.FirstOrDefault(w => w.name == data.ToName);
|
||||||
|
if (monoScript == null)
|
||||||
|
{
|
||||||
|
Debug.LogError("没找到" + data.ToName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(monoScript));
|
||||||
|
data.ToGUID = guid;
|
||||||
|
data.monoScript = monoScript;
|
||||||
|
}
|
||||||
|
Debug.Log("写入完毕");
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<T> FindAllAssetsOfType<T>() where T : UnityEngine.Object
|
||||||
|
{
|
||||||
|
List<T> assets = new List<T>();
|
||||||
|
|
||||||
|
string[] allGuids = AssetDatabase.FindAssets("");
|
||||||
|
foreach (string guid in allGuids)
|
||||||
|
{
|
||||||
|
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||||||
|
if (path.EndsWith(".cs") || path.EndsWith(".js") || path.EndsWith(".boo")) // Unity支持多种脚本语言,但现代Unity主要使用C#
|
||||||
|
{
|
||||||
|
T asset = AssetDatabase.LoadAssetAtPath<T>(path);
|
||||||
|
if (asset != null)
|
||||||
|
{
|
||||||
|
assets.Add(asset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return assets;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MenuItem("移植工具/[4]替换所有预制体")]
|
||||||
|
public static void Part4()
|
||||||
|
{
|
||||||
|
AxiPrefabCache cache = AssetDatabase.LoadAssetAtPath<AxiPrefabCache>(cachecfgPath);
|
||||||
|
Dictionary<string, string> tempReplaceDict = new Dictionary<string, string>();
|
||||||
|
foreach(var data in cache.caches)
|
||||||
|
{
|
||||||
|
tempReplaceDict[data.GUID] = data.ToGUID;
|
||||||
|
}
|
||||||
|
ProcessAllPrefabs("*.prefab", tempReplaceDict);
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ProcessAllPrefabs(string form, Dictionary<string, string> tempReplaceDict, bool reverse = false)
|
||||||
|
{
|
||||||
|
List<GameObject> prefabs = new List<GameObject>();
|
||||||
|
var resourcesPath = Application.dataPath;
|
||||||
|
var absolutePaths = Directory.GetFiles(resourcesPath, form, SearchOption.AllDirectories);
|
||||||
|
for (int i = 0; i < absolutePaths.Length; i++)
|
||||||
|
{
|
||||||
|
Debug.Log("prefab name: " + absolutePaths[i]);
|
||||||
|
foreach (var VARIABLE in tempReplaceDict)
|
||||||
|
{
|
||||||
|
string oldValue = reverse ? VARIABLE.Value : VARIABLE.Key;
|
||||||
|
string newValue = reverse ? VARIABLE.Key : VARIABLE.Value;
|
||||||
|
ReplaceValue(absolutePaths[i], oldValue, newValue);
|
||||||
|
}
|
||||||
|
EditorUtility.DisplayProgressBar("处理预制体……", "处理预制体中……", (float)i / absolutePaths.Length);
|
||||||
|
}
|
||||||
|
EditorUtility.ClearProgressBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 替换值
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="strFilePath">文件路径</param>
|
||||||
|
static void ReplaceValue(string strFilePath, string oldLine, string newLine)
|
||||||
|
{
|
||||||
|
if (File.Exists(strFilePath))
|
||||||
|
{
|
||||||
|
string[] lines = File.ReadAllLines(strFilePath);
|
||||||
|
for (int i = 0; i < lines.Length; i++)
|
||||||
|
{
|
||||||
|
lines[i] = lines[i].Replace(oldLine, newLine);
|
||||||
|
}
|
||||||
|
File.WriteAllLines(strFilePath, lines);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 01c95f5e03a338749b54784eb6420d04
|
Loading…
Reference in New Issue
Block a user