Unity ReferenceFinder插件 窗口中选择资源时 同步选择Assets下的资源

GitHub地址


当在 窗口中选中资源时,实现 同步选中Assets下的资源对象的功能:

修改 AssetTreeView脚本 为:

csharp 复制代码
using UnityEngine;
using UnityEditor;
using UnityEditor.IMGUI.Controls;
using System.Collections.Generic;

// 带数据的 TreeViewItem
public class AssetViewItem : TreeViewItem
{
    public ReferenceFinderData.AssetDescription data;
}

// 资源引用树
public class AssetTreeView : TreeView
{
    const float kIconWidth = 18f;
    const float kRowHeights = 20f;

    public AssetViewItem assetRoot;

    private GUIStyle stateGUIStyle = new GUIStyle
    {
        richText = true,
        alignment = TextAnchor.MiddleCenter
    };

    enum MyColumns
    {
        Name,
        Path,
        State,
    }

    public AssetTreeView(TreeViewState state, MultiColumnHeader multicolumnHeader)
        : base(state, multicolumnHeader)
    {
        rowHeight = kRowHeights;
        columnIndexForTreeFoldouts = 0;
        showAlternatingRowBackgrounds = true;
        showBorder = false;
        customFoldoutYOffset = (kRowHeights - EditorGUIUtility.singleLineHeight) * 0.5f;
        extraSpaceBeforeIconAndLabel = kIconWidth;
    }

    // ================== 新增:选中同步到 Project ==================
    protected override void SelectionChanged(IList<int> selectedIds)
    {
        if (selectedIds == null || selectedIds.Count == 0)
            return;

        List<Object> objects = new List<Object>();

        foreach (var id in selectedIds)
        {
            var item = FindItem(id, rootItem) as AssetViewItem;
            if (item == null || item.data == null)
                continue;

            string path = item.data.path;
            if (string.IsNullOrEmpty(path))
                continue;

            var obj = AssetDatabase.LoadAssetAtPath<Object>(path);
            if (obj != null)
                objects.Add(obj);
        }

        if (objects.Count > 0)
        {
            Selection.objects = objects.ToArray();
            EditorGUIUtility.PingObject(objects[0]);
        }
    }
    // =============================================================

    protected override void ContextClickedItem(int id)
    {
        SetExpanded(id, !IsExpanded(id));
    }

    protected override void DoubleClickedItem(int id)
    {
        var item = FindItem(id, rootItem) as AssetViewItem;
        if (item != null && item.data != null)
        {
            var assetObject = AssetDatabase.LoadAssetAtPath<Object>(item.data.path);
            if (assetObject != null)
            {
                EditorUtility.FocusProjectWindow();
                Selection.activeObject = assetObject;
                EditorGUIUtility.PingObject(assetObject);
            }
        }
    }

    public static MultiColumnHeaderState CreateDefaultMultiColumnHeaderState(float treeViewWidth)
    {
        var columns = new[]
        {
            new MultiColumnHeaderState.Column
            {
                headerContent = new GUIContent("Name"),
                headerTextAlignment = TextAlignment.Center,
                width = 200,
                minWidth = 60,
                autoResize = false,
                allowToggleVisibility = false,
                canSort = false
            },
            new MultiColumnHeaderState.Column
            {
                headerContent = new GUIContent("Path"),
                headerTextAlignment = TextAlignment.Center,
                width = 360,
                minWidth = 60,
                autoResize = false,
                allowToggleVisibility = false,
                canSort = false
            },
            new MultiColumnHeaderState.Column
            {
                headerContent = new GUIContent("State"),
                headerTextAlignment = TextAlignment.Center,
                width = 60,
                minWidth = 60,
                autoResize = false,
                allowToggleVisibility = true,
                canSort = false
            },
        };

        return new MultiColumnHeaderState(columns);
    }

    protected override TreeViewItem BuildRoot()
    {
        return assetRoot;
    }

    protected override void RowGUI(RowGUIArgs args)
    {
        var item = (AssetViewItem)args.item;
        for (int i = 0; i < args.GetNumVisibleColumns(); ++i)
        {
            CellGUI(args.GetCellRect(i), item, (MyColumns)args.GetColumn(i), ref args);
        }
    }

    void CellGUI(Rect cellRect, AssetViewItem item, MyColumns column, ref RowGUIArgs args)
    {
        CenterRectUsingSingleLineHeight(ref cellRect);

        switch (column)
        {
            case MyColumns.Name:
                var iconRect = cellRect;
                iconRect.x += GetContentIndent(item);
                iconRect.width = kIconWidth;

                if (iconRect.x < cellRect.xMax)
                {
                    var icon = GetIcon(item.data.path);
                    if (icon != null)
                        GUI.DrawTexture(iconRect, icon, ScaleMode.ScaleToFit);
                }

                args.rowRect = cellRect;
                base.RowGUI(args);
                break;

            case MyColumns.Path:
                GUI.Label(cellRect, item.data.path);
                break;

            case MyColumns.State:
                GUI.Label(
                    cellRect,
                    ReferenceFinderData.GetInfoByState(item.data.state),
                    stateGUIStyle
                );
                break;
        }
    }

    private Texture2D GetIcon(string path)
    {
        Object obj = AssetDatabase.LoadAssetAtPath<Object>(path);
        if (obj != null)
        {
            Texture2D icon = AssetPreview.GetMiniThumbnail(obj);
            if (icon == null)
                icon = AssetPreview.GetMiniTypeThumbnail(obj.GetType());
            return icon;
        }
        return null;
    }
}
相关推荐
天天摸鱼的java工程师2 小时前
🚪单点登录实战:同端同账号互踢下线的最佳实践(Java 实现)
java·后端
Kiri霧2 小时前
Go 结构体
java·开发语言·golang
狂奔小菜鸡2 小时前
Day29 | Java集合框架之Map接口详解
java·后端·java ee
爱学习的小可爱卢2 小时前
JavaEE进阶——Spring事务与传播机制实战指南
java·java-ee·事务
-大头.2 小时前
Java泛型实战:类型安全与高效开发
java·开发语言·安全
周杰伦_Jay2 小时前
【操作系统】进程管理与内存管理
java·数据库·缓存
serendipity_hky2 小时前
【SpringCloud | 第3篇】Sentinel 服务保护(限流、熔断降级)
java·后端·spring·spring cloud·微服务·sentinel
Kiri霧2 小时前
Go 切片表达式
java·服务器·golang
漂亮的小碎步丶2 小时前
【2】Spring Boot自动装配
java·spring boot·后端