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;
    }
}
相关推荐
小途软件4 分钟前
ssm327校园二手交易平台的设计与实现+vue
java·人工智能·pytorch·python·深度学习·语言模型
alonewolf_997 分钟前
Java类加载机制深度解析:从双亲委派到热加载实战
java·开发语言
追梦者1239 分钟前
springboot整合minio
java·spring boot·后端
云游12 分钟前
Jaspersoft Studio community edition 7.0.3的应用
java·报表
帅气的你17 分钟前
Spring Boot 集成 AOP 实现日志记录与接口权限校验
java·spring boot
zhglhy37 分钟前
Spring Data Slice使用指南
java·spring
win x1 小时前
Redis 主从复制
java·数据库·redis
weixin_423995001 小时前
unity 处理图片:截图,下载,保存
java·unity·游戏引擎
帅气的你1 小时前
从零封装一个通用的 API 接口返回类:统一前后端交互格式
java·设计模式
qq_178057071 小时前
基于minio实现的分片上传-支持断点续传
java