using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace Assets.Editor
{
public class 团结GUID修复工具 : EditorWindow
{
[MenuItem("Tool/团结GUID修复工具")]
static void Open()
{
GetWindow<团结GUID修复工具>().Show();
}
const string GuidHeader = "guid:";
const string FileNameExt_Meta = ".meta";
UnityEngine.Object _uo;
private void OnGUI()
{
GUILayout.Label("====处理单个文件====");
_uo = EditorGUILayout.ObjectField(_uo, typeof(UnityEngine.Object), false) as UnityEngine.Object;
GUILayout.Space(10);
if (GUILayout.Button( "PrintGUID"))
{
PrintGUID();
}
if (GUILayout.Button("修复GUID"))
{
修复GUID();
}
GUILayout.Space(30);
GUILayout.Label("====处理所有文件====");
if (GUILayout.Button("搜索异常GUID_Meta文件"))
{
搜索异常GUID_Meta文件(false);
}
if (GUILayout.Button("搜索异常GUID_Meta文件并修复"))
{
搜索异常GUID_Meta文件(true);
}
}
void PrintGUID()
{
var path = AssetDatabase.GetAssetPath(_uo);
var guid = AssetDatabase.GUIDFromAssetPath(path);
var guidSTR = AssetDatabase.AssetPathToGUID(path);
var data = guid.ToString();
Debug.Log($"PrintGUID 0:{guid}");
Debug.Log($"PrintGUID STR:{guidSTR}");
if(System.Guid.TryParse(data, out System.Guid sguid))
{
Debug.Log($"PrintGUID 1:" + sguid.ToString("D"));
Debug.Log($"PrintGUID 2:" + sguid.ToString("N"));
Debug.Log($"PrintGUID 3:" + sguid.ToString("B"));
Debug.Log($"PrintGUID 4:" + sguid.ToString("P"));
Debug.Log($"PrintGUID 5:" + sguid.ToString("X"));
}
else
{
Debug.Log("解析失败!");
}
}
void 搜索异常GUID_Meta文件(bool isFix)
{
string title = nameof(搜索异常GUID_Meta文件);
try
{
string[] dirs = new string[] { "Assets", "Packages" };
int dirIndex = 0;
float dirTotal = dirs.Length;
int fileIndex = 0;
float fileTotal = 0;
foreach (var dir in dirs)
{
var files = Directory.EnumerateFiles(dir, "*.meta", SearchOption.AllDirectories);
fileTotal = files.Count();
foreach (var file in files)
{
检测异常Meta(file, isFix);
EditorUtility.DisplayProgressBar(title, $"第[{dirIndex}/{dirTotal}]步:[{file}]", fileIndex / fileTotal);
fileIndex++;
}
dirIndex++;
}
}
finally
{
EditorUtility.ClearProgressBar();
}
}
/// <summary>
/// 检测异常Meta
/// </summary>
/// <param name="file">meta文件路径</param>
/// <param name="isFix">是否修复</param>
void 检测异常Meta(string file,bool isFix)
{
string TEMP = "dc228622d3300604fab783d3c7eba6e8";
string ErrorMetaLine = "guid: XXoW4yOrUXklVBj6RRvTdrgI/QcciQCE2vpUgNRszPt8z17/KGzrK1Y=";
var lines = File.ReadAllLines(file);
for (int i = 0; i < lines.Length; i++)
{
var line = lines[i];
if (line.StartsWith(GuidHeader))
{
//Debug.Log($"搜索异常Meta:[{file}]---line:[{i}]--data:[{line}]----");
string guidStr = line[GuidHeader.Length..].Trim();
if (guidStr.Length > TEMP.Length)
{
Debug.LogError($"异常meta:[{guidStr}]--file:[{file}]");
var assetName = file[0..(file.Length - FileNameExt_Meta.Length)];
Debug.Log($"目标文件:[{assetName}]");
if (isFix)
{
修复GUID(assetName);
}
}
return;
}
}
Debug.LogError($"未找到GUID:[{file}]");
}
void 修复GUID()
{
var filepath = AssetDatabase.GetAssetPath(_uo);
修复GUID(filepath);
}
/// <summary>
/// 修复GUID
/// </summary>
/// <param name="file">资源文件路径</param>
void 修复GUID(string file)
{
var guidStr = AssetDatabase.AssetPathToGUID(file);
var metaPath = $"{file}.meta";
var lines = File.ReadAllLines(metaPath);
lines[1] = $"{GuidHeader} {guidStr}";
Debug.Log($"修复:[{file}]--guid:{guidStr}");
File.WriteAllLines(metaPath, lines);
}
}
}
网友评论