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);
}
}
}
团结GUID修复工具
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 因为前面Hbase2集群出现过一次故障,当时花了一个周末才修好,就去了解整理了一些hbase故障的,事故现场可以看...
- 前言 由于Xcode的习惯,很多OC代码中.h文件引用都是只写文件的,因为Xcode会自动查找该文件的真实位置再传...
- 介绍 DirectX 修复工具 V4.3 是一款高效的系统修复工具,专为解决 系统异常 和 C++ 运行库 问题而...
- 1. 背景 在了解HBCK2之前,建议先了解一下啥是HBCK。HBCK是HBase1.x中的命令,到了HBase2...
- 图片压缩在我们生活中经常出现,发个朋友圈图片会被压缩,拍好的4K视频发布到社交平台也会被压缩。 很多网站为什么都需...