Unity编辑器拓展-查看资源被引用的状况

1,822 阅读1分钟

根据sprite查看被哪些prefab引用

项目中经常会有重复被使用或者重复的资源图片,在整理的时候想查看图片被哪些prefab引用好进行安全清除。可以利用AssetDataBase相关API查找资源的GUID,GUID是每个资源在导入后唯一存在的。根据GUID查看整个AssetDatabase中的所有Prefab中含有GUID的引用。

之前都是直接打log输出Prefab名字,还要手动进行复制搜索,操作繁琐。 网上搜到的一个工具,很好用,可以直接点击查看进行跳转,使用了EditorGUI的ObjectField

代码

public class SearchReferenceEditorWindow : EditorWindow
{
    [MenuItem("Assets/SearchReference")]
    static void SearchRef()
    {
        SearchReferenceEditorWindow window =
            (SearchReferenceEditorWindow) EditorWindow.GetWindow(typeof(SearchReferenceEditorWindow), false, "Searching", true);
    }

    private static Object _searchObject;
    private List<Object> _resultList = new List<Object>();

    private void OnGUI()
    {
        EditorGUILayout.BeginHorizontal();
        _searchObject = EditorGUILayout.ObjectField(_searchObject, typeof(Object), true, GUILayout.Width(200));
        if (GUILayout.Button("Search", GUILayout.Width(100)))
        {
            _resultList.Clear();
            if (_searchObject == null)
            {
                return;
            }

            string assetPath = AssetDatabase.GetAssetPath(_searchObject); // 获取资源的路径
            string assetGuid = AssetDatabase.AssetPathToGUID(assetPath); // 获取资源的GUID

            // / 遍历工程中的所有Object,第一个参数搜索变量,第二个参数,搜索文件夹目录
            string[] guids = AssetDatabase.FindAssets("t:Prefab", new[] {"Assets"});
            int length = guids.Length;
            for (int i = 0; i < length; i++)
            {
                string filePath = AssetDatabase.GUIDToAssetPath(guids[i]); // 获取每个Prefab路径
                EditorUtility.DisplayCancelableProgressBar("Checking", filePath, i / length * 1.0f);
                string content = File.ReadAllText(filePath); // 查找prefab文件中的引用
                if (content.Contains(assetGuid))
                {
                    Object fileObject = AssetDatabase.LoadAssetAtPath(filePath, typeof(Object)); // 将Prefab加载到ObjectField上
                    _resultList.Add(fileObject);
                }

                EditorUtility.ClearProgressBar();
            }
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginVertical();
        foreach (var obj in _resultList)
        {
            EditorGUILayout.ObjectField(obj, typeof(Object), true, GUILayout.Width(300));
        }
        EditorGUILayout.EndVertical();
    }
}