Unity编辑器工具——查找引用过指定图片的GameObject

最近尝试做了一些编辑器工具,打算记录分享出来,希望以后能用到并且能帮助有需要的人!

废话不多说,先看效果图吧。

d2c6bcc2121449b487cb8d78f5a7a74a.png

使用说明:

1、在菜单栏Tools打开如图所示的窗口

2、将需要查找的图片拖入框内

a6d85d56be2f4524b9609b5fe8be43e1.png

3、点击筛选后,会在Hierarchy中自动定位选中到引用了该图片的GameObject

4617fd1fa1f4442eb011e6c8892d5f07.png

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);
    }

}

 

 

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值