Unity 编辑器工具 - 资源引用查找器

Unity 编辑器工具 - 资源引用查找器

码农世界 2024-05-16 前端 66 次浏览 0个评论

目录

1.功能概述

2.完整代码

3. 实现原理

4. 使用预览

5.新增优化版本


在Unity项目开发过程中,管理和维护资源之间的引用关系是至关重要的。当然我们项目也是需要这个功能 毕竟项目大了之后查找资源引用还是交给 资源引用查找器 比较好。

1.功能概述

资源引用查找器允许开发者选择一个目标资源,并在整个项目中查找引用了该资源的其他资源。其主要功能包括:

  • 在Unity编辑器菜单栏下添加一个名为"Resource Reference Finder"的菜单项。
  • 提供一个可调整大小的窗口,用于选择目标资源和显示引用结果。
  • 通过点击"Search"按钮来触发搜索过程,查找所有引用了目标资源的Prefab文件,并将结果展示在窗口中。

    2.完整代码

    using UnityEditor;
    using UnityEngine;
    using System.Collections.Generic;
    using System.IO;
    public class ResourceReferenceFinder : EditorWindow
    {
        [MenuItem("Assets/Resource Reference Finder")]
        static void SearchReference()
        {
            GetWindow("Resource Reference Finder");
        }
        private static Object targetResource;
        private List referencingAssets = new List();
        private Vector2 scrollPosition;
        private void OnGUI()
        {
            // 显示资源选择字段和搜索按钮
            EditorGUILayout.BeginHorizontal();
            GUILayout.Label("Select Target Resource:", GUILayout.Width(150));
            targetResource = EditorGUILayout.ObjectField(targetResource, typeof(Object), true, GUILayout.Width(200));
            if (GUILayout.Button("Search", GUILayout.Width(100)))
            {
                ReferenceFinder();
            }
            EditorGUILayout.EndHorizontal();
            // 滚动视图开始
            scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
            EditorGUILayout.BeginVertical();
            // 显示搜索结果
            for (int i = 0; i < referencingAssets.Count; i++)
            {
                EditorGUILayout.ObjectField(referencingAssets[i], typeof(Object), true, GUILayout.Width(300));
            }
            EditorGUILayout.EndVertical();
            EditorGUILayout.EndScrollView();
            // 滚动视图结束
        }
        // 查找引用
        private void ReferenceFinder()
        {
            referencingAssets.Clear();
            // 检查是否选择了资源
            if (targetResource == null)
            {
                Debug.LogWarning("Please select a resource to search for references.");
                return;
            }
            // 获取选择资源的 GUID
            string assetPath = AssetDatabase.GetAssetPath(targetResource);
            string assetGuid = AssetDatabase.AssetPathToGUID(assetPath);
            // 遍历项目中所有 Prefab 文件
            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]);
                EditorUtility.DisplayCancelableProgressBar("Checking", filePath, (float)i / length);
                // 读取 Prefab 文件内容,检查是否包含选择资源的 GUID
                string content = File.ReadAllText(filePath);
                if (content.Contains(assetGuid))
                {
                    // 如果包含,将该 Prefab 添加到结果列表中
                    Object referencingAsset = AssetDatabase.LoadAssetAtPath(filePath, typeof(Object));
                    referencingAssets.Add(referencingAsset);
                }
            }
            // 清除进度条
            EditorUtility.ClearProgressBar();
        }
    }
     
    

    3. 实现原理

    • 使用Unity编辑器提供的MenuItem特性,在菜单栏下添加了一个自定义的菜单项,用于触发资源引用查找器窗口的显示。
    • 创建了一个继承自EditorWindow的窗口类,实现了GUI绘制和资源引用搜索的逻辑。
    • 在GUI中,通过ObjectField和Button控件实现了目标资源的选择和搜索按钮的功能。
    • 使用AssetDatabase类来访问项目中的资源,并通过FindAssets方法查找所有Prefab文件。
    • 读取Prefab文件的内容,检查是否包含目标资源的GUID,如果是,则将该Prefab添加到引用结果列表中。

      4. 使用预览

      查找Prefab引用

      查找图片引用

      5.新增优化版本

      新增优化版本右键直接选中需要查找的资源  直接省略繁琐步骤 完整代码如下

      using UnityEditor;
      using UnityEngine;
      using System.Collections.Generic;
      using System.IO;
      public class ResourceReferenceFinder : EditorWindow
      {
          private List referencingAssets = new List();
          private Vector2 scrollPosition;
          [MenuItem("Assets/ZYT ASSETS/Find References", true)]
          private static bool ValidateSearchReference()
          {
              // 只在选中了对象且不是文件夹时才显示菜单项
              return Selection.activeObject != null && !AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(Selection.activeObject));
          }
          [MenuItem("Assets/ZYT ASSETS/Find References")]
          private static void SearchReference()
          {
              // 创建并打开资源引用查找窗口
              if (Selection.activeObject != null && !AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(Selection.activeObject)))
              {
                  GetWindow("Resource Reference Finder").ReferenceFinder(Selection.activeObject);
              }
          }
          private void OnGUI()
          {
              // 显示搜索结果
              EditorGUILayout.LabelField("Search Results:");
              // 滚动视图开始
              scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
              EditorGUILayout.BeginVertical();
              // 显示搜索结果
              for (int i = 0; i < referencingAssets.Count; i++)
              {
                  EditorGUILayout.ObjectField(referencingAssets[i], typeof(Object), true, GUILayout.Width(300));
              }
              EditorGUILayout.EndVertical();
              EditorGUILayout.EndScrollView();
              // 滚动视图结束
          }
          // 查找引用
          private void ReferenceFinder(Object targetResource)
          {
              referencingAssets.Clear();
              // 获取选择资源的 GUID
              string assetPath = AssetDatabase.GetAssetPath(targetResource);
              string assetGuid = AssetDatabase.AssetPathToGUID(assetPath);
              // 遍历项目中所有 Prefab 文件
              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]);
                  EditorUtility.DisplayCancelableProgressBar("Checking", filePath, (float)i / length);
                  // 读取 Prefab 文件内容,检查是否包含选择资源的 GUID
                  string content = File.ReadAllText(filePath);
                  if (content.Contains(assetGuid))
                  {
                      // 如果包含,将该 Prefab 添加到结果列表中
                      Object referencingAsset = AssetDatabase.LoadAssetAtPath(filePath, typeof(Object));
                      referencingAssets.Add(referencingAsset);
                  }
              }
              // 清除进度条
              EditorUtility.ClearProgressBar();
          }
      }
       
      

       使用方法  

      如果未选中资源则是如下状况 工具是没法使用的

      下图是现在修改后的界面

      转载请注明来自码农世界,本文标题:《Unity 编辑器工具 - 资源引用查找器》

      百度分享代码,如果开启HTTPS请参考李洋个人博客
      每一天,每一秒,你所做的决定都会改变你的人生!

      发表评论

      快捷回复:

      评论列表 (暂无评论,66人围观)参与讨论

      还没有评论,来说两句吧...

      Top