脚本查找项目中的引用

作者: zcwfeng | 来源:发表于2017-12-18 13:38 被阅读0次

    方法一:

    using UnityEngine;
    using System.Collections;
    using UnityEditor;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Collections.Generic;
     
    public class FindReferences
    {
      
        [MenuItem("Assets/Find References", false, 10)]
        static private void Find()
        {
            EditorSettings.serializationMode = SerializationMode.ForceText;
            string path = AssetDatabase.GetAssetPath(Selection.activeObject);
            if (!string.IsNullOrEmpty(path))
            {
                string guid = AssetDatabase.AssetPathToGUID(path);
                List withoutExtensions = new List(){".prefab",".unity",".mat",".asset"};
                string[] files = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories)
                    .Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray();
                int startIndex = 0;
     
                EditorApplication.update = delegate()
                {
                    string file = files[startIndex];
                
                     bool isCancel = EditorUtility.DisplayCancelableProgressBar("匹配资源中", file, (float)startIndex / (float)files.Length);
     
                    if (Regex.IsMatch(File.ReadAllText(file), guid))
                    {
                        Debug.Log(file, AssetDatabase.LoadAssetAtPath<Object>(GetRelativeAssetsPath(file)));
                    }
     
                    startIndex++;
                    if (isCancel || startIndex >= files.Length)
                    {
                        EditorUtility.ClearProgressBar();
                        EditorApplication.update = null;
                        startIndex = 0;
                        Debug.Log("匹配结束");
                    }
     
                };
            }
        }
     
        [MenuItem("Assets/Find References", true)]
        static private bool VFind()
        {
            string path = AssetDatabase.GetAssetPath(Selection.activeObject);
            return (!string.IsNullOrEmpty(path));
        }
     
        static private string GetRelativeAssetsPath(string path)
        {
            return "Assets" + Path.GetFullPath(path).Replace(Path.GetFullPath(Application.dataPath), "").Replace('\\', '/');
        }
    }
    

    方法二,只能在mac上使用 :

    using UnityEngine;
    using System.Collections;
    using UnityEditor;
    using System.Collections.Generic;
     
    public class FindProject {
        
        #if UNITY_EDITOR_OSX
        
        [MenuItem("Assets/Find References In Project", false, 2000)]
        private static void FindProjectReferences()
        {
            string appDataPath = Application.dataPath;
            string output = "";
            string selectedAssetPath = AssetDatabase.GetAssetPath (Selection.activeObject);
            List<string> references = new List<string>();
            
            string guid = AssetDatabase.AssetPathToGUID (selectedAssetPath);
            
            var psi = new System.Diagnostics.ProcessStartInfo();
            psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
            psi.FileName = "/usr/bin/mdfind";
            psi.Arguments = "-onlyin " + Application.dataPath + " " + guid;
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;
            
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo = psi;
            
            process.OutputDataReceived += (sender, e) => {
                if(string.IsNullOrEmpty(e.Data))
                    return;
                
                string relativePath = "Assets" + e.Data.Replace(appDataPath, "");
                
                // skip the meta file of whatever we have selected
                if(relativePath == selectedAssetPath + ".meta")
                    return;
                
                references.Add(relativePath);
                
            };
            process.ErrorDataReceived += (sender, e) => {
                if(string.IsNullOrEmpty(e.Data))
                    return;
                
                output += "Error: " + e.Data + "\n";
            };
            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            
            process.WaitForExit(2000);
            
            foreach(var file in references){
                output += file + "\n";
                Debug.Log(file, AssetDatabase.LoadMainAssetAtPath(file));
            }
            
            Debug.LogWarning(references.Count + " references found for object " + Selection.activeObject.name + "\n\n" + output);
        }
        
        #endif
    

    相关文章

      网友评论

        本文标题:脚本查找项目中的引用

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