Untiy 查找缺失的GUID

背景

游戏资源移植的时候经常会出现引用丢失的问题,所以想到通过查找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("/", "\\"));
    }

猜你喜欢

转载自blog.csdn.net/ABCGods/article/details/122987649