Unity 创建 Custom Editor Overlay Tool

参考

Create CUSTOM EDITOR OVERLAY TOOL inside Unity!!! (2021.3+) (youtube.com)

使用自定义 Editor 工具 - Unity 手册

Create custom Overlays - Unity 手册

介绍

您可以为场景视图窗口创建自定义panel Overlaystoolbar Overlays

拓展你的工具

Panel Overlays

一个简单的实例

效果:

image-20231227181112109

代码:

using UnityEngine;
using UnityEditor.Overlays; // 使用Unity编辑器的Overlays命名空间
using UnityEngine.UIElements;
using UnityEditor;
[Overlay(typeof(SceneView),id: ID_OVERLAY, "EnvironmentOverlay_Name")]
// 定义了一个Overlay特性,将该类作为场景视图(SceneView)的覆盖层
// id参数指定了覆盖层的ID,这个ID是唯一的,用于标识覆盖层
//"EnvironmentOverlay_Name"是显示在Unity编辑器中的名称
[Icon("Assets/AFramework/1.PA/Icon/Main.png")]
// Icon特性可以为覆盖层指定一个图标,这里指定了一个图标,图标路径是Assets/AFramework/1.PA/Icon/Main.png
public class EnvironmentOverlay : Overlay
{
    private const string ID_OVERLAY = "EnvironmentOverlay_ID";
    public override VisualElement CreatePanelContent()
    {
        //这里是绘制UI的地方,编写方式与UIToolKit一致
        var root = new VisualElement();
        root.Add(new Label("EnvironmentOverlay"));
        return root;
    }
}

Toolbar Overlays

ToolbarOverlaysPanelOverlays的主要区别是,支持在PanelOverlays的基础上,绑定一个EditorToolbar对象.

PanelOverlays对象在右键时

20bce67d43f57baf253b4ef9ffe8aa8

ToolbarOverlays对象在右键时,多出了Horizontal与Vertical选项,在选择这两个选项时,会显示与其绑定的EditorToolbar对象

image-20231227184220207

一个简单的实例

效果:

EditorToolbar对象有以下几种,此处仅展示EditorToolbarButton对象的代码

image-20231227184434160

Horizontal的EditorToolbarButton

image-20231227184607928

Vertical的EditorToolbarButton

image-20231227184645348

切换回Panel时与PanelOverlays没有区别

image-20231227184840663

代码:

ToolbarOverlay对象

using UnityEngine;
using UnityEditor.Overlays; // 使用Unity编辑器的Overlays命名空间
using UnityEngine.UIElements;
using UnityEditor;
[Overlay(typeof(SceneView),id: ID_OVERLAY, "EnvironmentOverlay_Name")]
// 定义了一个Overlay特性,将该类作为场景视图(SceneView)的覆盖层
// id参数指定了覆盖层的ID,这个ID是唯一的,用于标识覆盖层
//"EnvironmentOverlay_Name"是显示在Unity编辑器中的名称
[Icon("Assets/AFramework/1.PA/Icon/Main.png")]
// Icon特性可以为覆盖层指定一个图标,这里指定了一个图标,图标路径是Assets/AFramework/1.PA/Icon/Main.png
public class EnvironmentOverlay : ToolbarOverlay
{
    public EnvironmentOverlay() : base(NPCTool.ID)//给ToolbarOverlay的构造函数传入NPCTool的ID,这样就将当前覆盖层与NPCTool绑定了
    {
        
    }
    private const string ID_OVERLAY = "EnvironmentOverlay_ID";
    public override VisualElement CreatePanelContent()
    {
        //这里是绘制UI的地方,编写方式与UIToolKit一致
        var root = new VisualElement();
        root.Add(new Label("EnvironmentOverlay"));
        return root;
    }
}

EditorToolbarButton对象

using UnityEditor;
using UnityEditor.Toolbars;
using UnityEngine;
[EditorToolbarElement(id: ID, typeof(SceneView))]
public class NPCTool : EditorToolbarButton
{
    public const string ID = "NPCTool_ID";

    public NPCTool()
    {
        text = "NPC";
        icon = EditorGUIUtility.IconContent("Avatar Icon").image as Texture2D;//这里直接使用了Untiy的Avatar Icon图标
        clicked += () =>
        {
            Debug.Log("NPC");
        };
    }
}
最后修改:2023 年 12 月 27 日
如果觉得我的文章对你有用,请随意赞赏