背景
游戏资源移植的时候经常会出现引用丢失的问题,所以想到通过查找GUID的方式来快速定位缺失的文件。
获取选中文件的GUID(出现引用丢失的文件)
/// <summary>
/// 获取选中的所有GUID信息
/// </summary>
static void GetAllGUIDFromChoose()
{
var gameObjects = Selection.GetFiltered<UnityEngine.Object>(UnityEditor.SelectionMode.DeepAssets);
GuidList.Clear();
foreach (var obj in gameObjects)
{
var go = obj as GameObject;
if (go == null)
continue;
string objPath = AssetDatabase.GetAssetPath(go);
//string objGuid = AssetDatabase.AssetPathToGUID(objPath);
string path = AppPath + objPath;
path = path.Replace("/", "\\");
if (File.Exists(path))
{
TextReader r = new StreamReader(path, Encoding.GetEncoding("UTF-8"));
string line = string.Empty;
while (true)
{
line = r.ReadLine();
if (line != null)
{
MatchCollection mc = regex.Matches(line);
foreach (Match ma in mc)
{
if (mc.Count != 0)
{
if (!string.IsNullOrEmpty(ma.Value.ToString()) && !GuidList.Contains(ma.Value))
{
Debug.Log("GUID = " + ma.Value.ToString());
GuidList.Add(ma.Value);
}
}
}
}
else
{
break;
}
}
r.Close();
}
else
{
Debug.Log("objPath = " + path);
}
}
}
获取目标工程Asset文件下的GUID
/// <summary>
/// 获取Assets下的GUID
/// </summary>
static void GetAssetsGUID()
{
writer2 = new StreamWriter(MainGUIDPath, false, Encoding.GetEncoding("UTF-8"));
DirectoryInfo directoryInfo = new DirectoryInfo(AssetsPath);
FileInfo[] fileInfos = directoryInfo.GetFiles("*", SearchOption.AllDirectories);
foreach (FileInfo files in fileInfos)
{
string filesPath = files.FullName;
string needpath = "Assets" + filesPath.Remove(0, UnityEngine.Application.dataPath.Length);
string AssetsGuid = AssetDatabase.AssetPathToGUID(needpath);
if (!AssetsGuidList.ContainsKey(AssetsGuid))
{
AssetsGuidList.Add(AssetsGuid, needpath);
string writerGUID = AssetsGuid + ", " + needpath;
writer2.WriteLine(writerGUID);
}
}
writer2.Flush();
writer2.Close();
System.Diagnostics.Process.Start("explorer.exe", MainGUIDPath.Replace("/", "\\"));
}
获取来源工程中的GUID
/// <summary>
/// 获取来源工程中所有的GUID
/// </summary>
void FindPathInMian()
{
writer = new StreamWriter(FromGUIDPath, false, Encoding.GetEncoding("UTF-8"));
DirectoryInfo directoryInfo = new DirectoryInfo(AssetsPathForMian);
FileInfo[] fileInfos = directoryInfo.GetFiles("*.meta", SearchOption.AllDirectories);
foreach (FileInfo files in fileInfos)
{
TextReader r = new StreamReader(files.FullName, Encoding.GetEncoding("UTF-8"));
string line = string.Empty;
while (true)
{
line = r.ReadLine();
if (line != null)
{
MatchCollection mc = regex1.Matches(line);
foreach (Match ma in mc)
{
if (!FromGuidList.ContainsKey(ma.Value))
{
FromGuidList.Add(ma.Value, files.FullName);
string writeWord = ma.Value.ToString() + "," + files.FullName;
writer.WriteLine(writeWord);
}
}
}
else
{
break;
}
}
r.Close();
}
writer.Flush();
writer.Close();
System.Diagnostics.Process.Start("explorer.exe", MainGUIDPath.Replace("/", "\\"));
}