层级视图/Hierarchy层级项进行自定义

本文介绍了如何在Unity编辑器中自定义层级视图的显示,包括使用EditorApplication.hierarchyWindowItemOnGUI绘制对象激活状态的色块,以及添加一个可撤销的游戏对象删除按钮。通过EditorUtility.InstanceIDToObject获取GameObject,并利用GUI和Undo.DestroyObjectImmediate实现交互功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意

  • 编辑器代码应放置在合理的Editor中。
  • 使用AssemblyDefinition应注意设置生效平台仅Editor。

主要API

  • EditorApplication.hierarchyWindowItemOnGUI用于层级窗口元素gui绘制回调。
  • EditorUtility.InstanceIDToObject(instanceId)通过实例ID获取对象。
  • InitializeOnLoad允许在 Unity 加载时和重新编译脚本时初始化 Editor 类。

案例一

在层级视图通过色块显示当前项是否激活

在这里插入图片描述
在这里插入图片描述

主要API

  • go.activeInHierarchy是否在层级视图激活,子物体会受父级状态所影响。

代码

using UnityEditor;
using UnityEngine;
/// <summary>
/// 允许在 Unity 加载时和重新编译脚本时初始化 Editor 类
/// </summary>
[InitializeOnLoad]
public class HierarchyDrawEditor
{
    static HierarchyDrawEditor()
    {
        EditorApplication.hierarchyWindowItemOnGUI -= HierarchyIconsOnGUI;
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyIconsOnGUI;
    }
    static void HierarchyIconsOnGUI(int instanceId, Rect selectionRect)
    {
        //通过InstanceID获取对象
        var go = (GameObject)EditorUtility.InstanceIDToObject(instanceId);
        if (go)
        {
            Rect rect = selectionRect;
            rect.x += selectionRect.width - 20;
            rect.width = 20;
            ///activeInHierarchy,用于自身是否在层级视图激活
            GUI.color = go.activeInHierarchy ? Color.green : Color.red;
            GUI.Box(rect,"");
            //恢复GUI默认色
            GUI.color = Color.white;
        }        
    }
}

案例二

在层级视图增加一个快速删除游戏对象的按钮。
在这里插入图片描述

主要API

  • Undo.DestroyObjectImmediate(go);可撤销的删除操作。
  • AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/你的包名/Editor/icons/delete.png");在UPM包内的相对路径加载。

代码

using UnityEditor;
using UnityEngine;
/// <summary>
/// 允许在 Unity 加载时和重新编译脚本时初始化 Editor 类
/// </summary>
[InitializeOnLoad]
public class HierarchyDrawEditor
{
    static Texture2D deleteicon;
    static HierarchyDrawEditor()
    {
        EditorApplication.hierarchyWindowItemOnGUI -= HierarchyIconsOnGUI;
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyIconsOnGUI;
        //如果你使用的是UPM包的话请使用Packages/你的包名/相对路径
        //deleteicon = AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/cn.mypackage/Editor/icons/delete.png");
        //提前读取对应的删除图标
        deleteicon = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Editor/icons/delete.png");
    }
    static void HierarchyIconsOnGUI(int instanceId, Rect selectionRect)
    {
        //通过InstanceID获取对象
        var go = (GameObject)EditorUtility.InstanceIDToObject(instanceId);
        if (go)
        {
            Rect rect = selectionRect;
            rect.x += selectionRect.width - 20;
            rect.width = 20;
            if (GUI.Button(rect, ""))
            {
                //这里使用的是Undo下的删除,主要目的是删除后可以Ctrl+Z进行撤销
                Undo.DestroyObjectImmediate(go);
            }
            //这里目的是让删除图标显示更大些,不嫌麻烦也可以制作个样式给按钮。
            GUI.Label(rect, deleteicon);
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值