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

目录

1.功能概述

2.完整代码

[3. 实现原理](#3. 实现原理)

[4. 使用预览](#4. 使用预览)

5.新增优化版本


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

1.功能概述

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

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

2.完整代码

cs 复制代码
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.IO;

public class ResourceReferenceFinder : EditorWindow
{
    [MenuItem("Assets/Resource Reference Finder")]
    static void SearchReference()
    {
        GetWindow<ResourceReferenceFinder>("Resource Reference Finder");
    }

    private static Object targetResource;
    private List<Object> referencingAssets = new List<Object>();
    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中,通过ObjectFieldButton控件实现了目标资源的选择和搜索按钮的功能。
  • 使用AssetDatabase类来访问项目中的资源,并通过FindAssets方法查找所有Prefab文件。
  • 读取Prefab文件的内容,检查是否包含目标资源的GUID,如果是,则将该Prefab添加到引用结果列表中。

4. 使用预览

查找Prefab引用

查找图片引用

5.新增优化版本

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

cs 复制代码
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.IO;

public class ResourceReferenceFinder : EditorWindow
{
    private List<Object> referencingAssets = new List<Object>();
    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<ResourceReferenceFinder>("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();
    }
}

使用方法

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

下图是现在修改后的界面

相关推荐
VidDown11 天前
VidDown 工具站:免费、本地优先的开发者工具箱
javascript·编辑器·音视频·视频编解码·视频
VidDown11 天前
显卡处理视频技术详解:从硬解码到 NVENC,GPU 如何让视频处理起飞?
javascript·编辑器·音视频·视频编解码·视频
夜猫逐梦11 天前
【UE基础】03.蓝图与编辑器工作流
编辑器·ue·蓝图·ue编辑器
VidDown11 天前
视频帧率技术详解:从 24fps 到 120fps,帧率如何影响你的观看体验?
网络·网络协议·编辑器·音视频·视频编解码·视频
叶帆11 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
爱就是恒久忍耐11 天前
VSCode里如何比较2个branch
ide·vscode·编辑器
久数君11 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
bloglin9999911 天前
vscode中可视化的合并分支,在“合并编辑器中解析”中“与基线进行比较”是什么意思
ide·vscode·编辑器
会思考的猴子12 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
zyplayer-doc12 天前
企业知识库安全与权限管理完全指南:从加密到审计的六层防护
人工智能·安全·pdf·编辑器·创业创新