unity3d scene窗口选中物体, 在 hierarchy高光显示

在 Unity 中实现 "Scene 窗口选中物体时 Hierarchy 面板高光显示",核心思路是监听 Scene 窗口的选择事件 ,并通过 Unity 的EditorGUIUtilityEditorWindow相关 API 主动高亮 Hierarchy 面板中对应的物体条目。以下是完整的实现方案:

复制代码
using UnityEditor;
using UnityEngine;
using System;
using System.Reflection;

/// <summary>
/// Scene选中物体时,Hierarchy面板自动高光显示该物体
/// </summary>
[InitializeOnLoad]
public class HierarchyHighlightOnSceneSelect
{
    // 静态构造函数,Editor启动时初始化
    static HierarchyHighlightOnSceneSelect()
    {
        // 监听选择变更事件
        Selection.selectionChanged += OnSelectionChanged;
    }

    private static void OnSelectionChanged()
    {
        // 仅处理选中单个GameObject的情况(可根据需求修改为多物体)
        if (Selection.activeGameObject != null)
        {
            // 核心API:让Hierarchy高亮并滚动到目标物体
            EditorGUIUtility.PingObject(Selection.activeGameObject);

            // 【可选】强制刷新Hierarchy窗口(解决部分版本高亮不生效问题)
            RefreshHierarchyWindow();
        }
    }

    /// <summary>
    /// 强制刷新Hierarchy窗口(通过反射调用私有方法)
    /// </summary>
    private static void RefreshHierarchyWindow()
    {
        try
        {
            // 获取Hierarchy窗口实例
            EditorWindow hierarchyWindow = EditorWindow.GetWindow(Type.GetType("UnityEditor.SceneHierarchyWindow, UnityEditor"));
            if (hierarchyWindow == null) return;

            // 通过反射调用Hierarchy窗口的刷新方法
            MethodInfo refreshMethod = hierarchyWindow.GetType().GetMethod("Refresh", BindingFlags.NonPublic | BindingFlags.Instance);
            refreshMethod?.Invoke(hierarchyWindow, null);
        }
        catch (System.Exception e)
        {
            Debug.LogWarning("刷新Hierarchy失败:" + e.Message);
        }
    }

    // 【可选】防止内存泄漏,编辑器关闭时移除事件监听
    [InitializeOnLoadMethod]
    private static void Cleanup()
    {
        AssemblyReloadEvents.beforeAssemblyReload += () =>
        {
            Selection.selectionChanged -= OnSelectionChanged;
        };
    }
}


/*
 * 1. 支持多物体选中高亮
 *     修改OnSelectionChanged方法,遍历所有选中物体:
 *  private static void OnSelectionChanged()
    {
        if (Selection.gameObjects.Length > 0)
        {
            // 高亮最后一个选中的物体(Unity默认选中逻辑)
            GameObject target = Selection.gameObjects[Selection.gameObjects.Length - 1];
            EditorGUIUtility.PingObject(target);
            RefreshHierarchyWindow();
        }
    }
 */



/*
 * 2. 自定义高亮样式(进阶)
 *    如果需要自定义高亮颜色 / 效果(如边框、背景色),需重写 Hierarchy 的绘制逻辑:
    // 在原有类中添加以下代码              
    static HierarchyHighlightOnSceneSelect()
    {
        Selection.selectionChanged += OnSelectionChanged;
        // 注册Hierarchy绘制回调
        EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI;
    }

    private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect)
    {
        // 获取当前绘制的物体
        GameObject go = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
        if (go == null) return;

        // 如果是选中的物体,绘制自定义高亮
        if (Selection.Contains(go))
        {
            // 绘制高亮背景
            EditorGUI.DrawRect(selectionRect, new Color(0.2f, 0.5f, 1f, 0.3f));
            // 绘制边框
            Rect borderRect = selectionRect;
            borderRect.width = 2;
            EditorGUI.DrawRect(borderRect, Color.cyan);
        }
    }
 */

使用说明

  1. 将脚本放在 Unity 项目的Editor文件夹下(若无则新建);
  2. 无需附加到任何物体,Editor 启动时自动生效;
  3. 在 Scene 窗口点击选中物体,Hierarchy 面板会自动定位并高亮该物体。
相关推荐
SmalBox10 小时前
【动态着色】Unity 实现消融效果
unity3d·游戏开发·图形学
_zhourui_h_11 小时前
我以为 ECSList 已经够快了,直到我直接拿到了 Column
unity3d
zhchyun20081 天前
# 【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(06)
ui·unity·游戏引擎
SmalBox1 天前
【动态着色】Unity 实现全息投影着色器
unity3d·游戏开发·图形学
Behaviour2 天前
Unity游戏HybridCLR 热更新接入实战
游戏·unity·游戏引擎
LONGZETECH2 天前
新能源汽车动力电池实训教学痛点与虚拟仿真技术解决方案
c语言·3d·unity·架构·汽车·汽车教学软件
王维志2 天前
UiSplineRenderer
unity·游戏引擎
SmalBox2 天前
【动态着色】Unity 实现箭头图案
unity3d·游戏开发·图形学
FairGuard手游加固2 天前
iOS 游戏加固技术解析:代码混淆、资源加密、内存保护与重签名检测
安全·游戏·macos·unity·ios·objective-c
SmalBox3 天前
【扭曲着色器】Unity实现-黑洞扭曲效果
unity3d·游戏开发·图形学