最近尝试做了一些编辑器工具,打算记录分享出来,希望以后能用到并且能帮助有需要的人!
废话不多说,先看效果图吧。
使用说明:
1、在菜单栏Tools打开如图所示的窗口
2、将需要查找的图片拖入框内
3、点击筛选后,会在Hierarchy中自动定位选中到引用了该图片的GameObject
4、点击“上一个”和“下一个”按钮可以选择到其他引用了该图片的GameObject
注意:这里用的是Resources.FindObjectsOfTypeAll,会获取Assets和Hierarchy的GameObject,因此在筛选的时候也会定位到Assets下引用过该图片的预制体。
附上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
public class FindImageRef : EditorWindow
{
// 拖入的图像
private Texture2D targetImage;
// 经过筛选后的对象列表
private List<GameObject> filteredObjects = new List<GameObject>();
// 初始化当前查看对象的索引
private int currentIndex = 0;
// 创建菜单项,在Unity编辑器中可以通过菜单打开窗口
[MenuItem("Tools/查找引用指定图片的组件")]
public static void ShowWindow()
{
// 获取窗口实例并命名
GetWindow<FindImageRef>("查找引用指定图片的组件工具");
}
// 绘制GUI界面
void OnGUI()
{
// 显示提示文本,让用户拖拽图像
GUILayout.Label("拖入图片:");
// 接收用户拖拽的图像对象
targetImage = EditorGUILayout.ObjectField(targetImage, typeof(Texture2D), false) as Texture2D;
// 点击按钮执行筛选操作
if (GUILayout.Button("筛选"))
{
FilterObjects(); //调用筛选函数
}
// 如果有筛选后的对象
if (filteredObjects.Count > 0)
{
// 显示筛选后的对象信息
GUILayout.Label("当前组件名:");
EditorGUILayout.ObjectField(filteredObjects[currentIndex], typeof(GameObject), true);
GUILayout.Label("组件数量:"+filteredObjects.Count);
// 显示上一个和下一个按钮,用于切换对象
GUILayout.BeginHorizontal();
if (GUILayout.Button("上一个"))
{
currentIndex = (currentIndex + 1) % filteredObjects.Count;
HighlightObjectInHierarchy(filteredObjects[currentIndex]);
}
if (GUILayout.Button("下一个"))
{
currentIndex = (currentIndex - 1 + filteredObjects.Count) % filteredObjects.Count;
HighlightObjectInHierarchy(filteredObjects[currentIndex]);
}
GUILayout.EndHorizontal();
}else
{
GUILayout.Label("未找到符合条件的对象。");
}
}
// 执行对象筛选操作
void FilterObjects()
{
if (targetImage == null)
{
Debug.LogWarning("请先确认是否将图片拖入窗口!");
return;
}
// 清空之前的筛选和排序结果
filteredObjects.Clear();
// 获取场景中所有的GameObject对象
GameObject[] allObjects = Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[];
foreach (var obj in allObjects)
{
Image imageComponent = obj.GetComponent<Image>();
if (imageComponent != null)
{
// 获取Image组件的Sprite对象
var imageSprite = imageComponent.sprite;
if (imageSprite != null)
{
// 比较拖入的图片名字和Image组件的SourceImage中图片名字是否相同
string imageSpriteName = imageSprite.name;
string targetImageName = targetImage.name;
if (imageSpriteName.Equals(targetImageName))
{
filteredObjects.Add(obj); //筛选后的对象加入列表
}
}
}
}
currentIndex = 0; // 当筛选完后重置索引
//如果有引用,则点击筛选按钮后显示列表里第一个
if (filteredObjects.Count > 0)
{
HighlightObjectInHierarchy(filteredObjects[0]);
}
}
// 在Hierarchy中高亮显示指定对象
void HighlightObjectInHierarchy(GameObject obj)
{
// 将指定对象设置为活动对象,并居中显示
Selection.activeGameObject = obj;
EditorGUIUtility.PingObject(obj);
}
}