Unity 创建 Custom Editor Overlay Tool
参考
Create CUSTOM EDITOR OVERLAY TOOL inside Unity!!! (2021.3+) (youtube.com)
Create custom Overlays - Unity 手册
介绍
您可以为场景视图窗口创建自定义panel Overlays
和toolbar Overlays
拓展你的工具
Panel Overlays
一个简单的实例
效果:
代码:
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
ToolbarOverlays
与PanelOverlays
的主要区别是,支持在PanelOverlays
的基础上,绑定一个EditorToolbar
对象.
PanelOverlays
对象在右键时
ToolbarOverlays
对象在右键时,多出了Horizontal与Vertical选项,在选择这两个选项时,会显示与其绑定的EditorToolbar
对象
一个简单的实例
效果:
EditorToolbar
对象有以下几种,此处仅展示EditorToolbarButton
对象的代码
Horizontal的EditorToolbarButton
Vertical的EditorToolbarButton
切换回Panel时与PanelOverlays
没有区别
代码:
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");
};
}
}