目录
在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<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中,通过
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<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();
}
}
使用方法
如果未选中资源则是如下状况 工具是没法使用的
下图是现在修改后的界面