美文网首页
团结GUID修复工具

团结GUID修复工具

作者: 灰的狼 | 来源:发表于2025-02-12 15:25 被阅读0次
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修复工具

      本文链接:https://www.haomeiwen.com/subject/pywcpjtx.html