Unity编辑器界面扩展——1、Unity自定义编辑器窗体

  大家好,我是阿赵。这次来分享一下在Unity引擎里面怎样对编辑器的界面进行扩展。
  第一篇先分享一下Unity编辑器怎样自定义窗体。

1、简单的创建一个窗体

在这里插入图片描述

using UnityEditor;
using UnityEngine;
public class TestEditorWindow : EditorWindow
{
   
   
    [MenuItem("Tools/TestWindow")]
    private static void ShowTestWindow()
    {
   
   
        GetWindow<TestEditorWindow>("测试窗体");
    }

    void OnGUI()
    {
   
   
        GUILayout.Label("这是一个测试界面");
    }
}

在这里插入图片描述

在这里插入图片描述

加粗样式注意事项

  1. 编辑器类脚本一定要放到Editor文件夹里面
      这个Editor文件夹不一定在Assets/Editor,只需要父级文件夹是Editor就行,可以放在别的文件里面。
  2. using UnityEditor;
      想使用编辑器的API,必须要引用UnityEditor。
  3. 继承EditorWindow
    由于是想显示一个窗体,所以要继承EditorWindow,这样这个类就会有一个窗体的载体和生命周期。
  4. MenuItem
      这是Unity编辑器添加菜单选项的方法。里面的参数是路径,比如刚才的例子
[MenuItem("Tools/TestWindow")]

  所以菜单会出现在Unity编辑器的顶部菜单栏,先出现一个Tools的选项,点击进去,会看到二级菜单”TestWindow”。
5. GetWindow
  完整的方法名称是EditorWindow.GetWindow(),由于我们这里已经继承了EditorWindow,所以直接用GetWindow也能调用。传入需要获得的窗体的类型,就可以得到一个对应类型的窗体。
  如果窗体已经显示了出来,返回的就是当前显示的窗体对象。如果这个窗体没有被创建过,就会创建一个新的对应类型的窗体,并且返回这个窗体的实例对象。
6. OnGUI
  需要显示的窗体内容,将会写在OnGUI方法里面。

2、 控制窗体标题和大小

  之前通过GetWindow方法,传入了一个标题,其实也可以不传参数,而在后面修改标题,比如这样:

TestEditorWindow win = GetWindow<TestEditorWindow>();
win.titleContent = new GUIContent("测试窗体");

  通过titleContent可以指定窗体的标题。
  默认的窗体,是没有指定大小的,可以随意的拖动缩放大小。
  如果想指定窗体的大小范围,可以:

win.maxSize = new Vector2(600, 600);
win.minSize = new Vector2(
Unity 编辑器中集成 WinForms 或 WPF UI 是一种常见的需求,尤其是在开发复杂的编辑器工具时,需要使用成熟的 UI 框架来构建功能丰富、可扩展界面Unity 编辑器本身基于 .NET 框架,因此在 Unity编辑器脚本中可以直接使用 WinForms 或 WPF,但需要注意与 Unity 主线程的交互以及窗口嵌入的问题。 ### 在 Unity 编辑器中嵌入 WinForms 界面 WinForms 是一个轻量级的 UI 框架,适合快速构建桌面应用程序界面。在 Unity 编辑器中使用 WinForms 时,可以通过调用 `EditorWindow` 获取 Unity 编辑器窗口的句柄(HWND),然后将 WinForms 窗口嵌入到 Unity 编辑器中。 以下是一个简单的 WinForms 窗体Unity 编辑器中显示的示例: ```csharp using UnityEditor; using UnityEngine; using System.Windows.Forms; public class WinFormsInUnity : EditorWindow { [MenuItem("Window/Show WinForms")] public static void ShowWindow() { GetWindow<WinFormsInUnity>(); } private void OnGUI() { if (GUILayout.Button("打开 WinForms 窗口")) { Application.EnableVisualStyles(); Form form = new Form(); form.Text = "WinForms 窗口"; form.Width = 300; form.Height = 200; Button button = new Button(); button.Text = "点击"; button.Click += (sender, e) => MessageBox.Show("按钮点击"); form.Controls.Add(button); form.Show(); } } } ``` 需要注意的是,WinForms 窗口默认是独立窗口,若需将其嵌入 Unity 编辑器面板中,需通过平台 API(如 Windows 的 `SetParent`)实现窗口嵌套,这涉及平台相关的 P/Invoke 调用,开发复杂度较高。 ### 在 Unity 编辑器中集成 WPF 界面 WPF 提供了更现代、灵活的 UI 开发能力,支持样式绑定、数据模板等功能。在 Unity 编辑器中使用 WPF 时,通常通过 `ElementHost` 或 `HwndSource` 将 WPF 控件嵌入到 Win32 窗口中。 以下是一个通过 `HwndSource` 创建 WPF 窗口的示例: ```csharp using System.Windows; using System.Windows.Interop; public class WpfWindowInUnity { public static void ShowWpfWindow() { Window wpfWindow = new Window(); wpfWindow.Title = "WPF 窗口"; wpfWindow.Width = 400; wpfWindow.Height = 300; Button button = new Button(); button.Content = "点击"; button.Click += (sender, e) => MessageBox.Show("WPF 按钮点击"); wpfWindow.Content = button; HwndSource hwndSource = new HwndSource(new HwndSourceParameters("WPFWindow")); hwndSource.RootVisual = wpfWindow.Content as UIElement; // 获取 Unity 编辑器窗口句柄并设置为父窗口 // 此处需通过 Win32 API 设置父窗口 wpfWindow.Show(); } } ``` WPF 的集成通常需要使用 `HwndSource` 来创建原生窗口,并通过 `SetParent` 设置其父窗口为 Unity 编辑器窗口。该方式可以实现更复杂的 UI 布局和交互逻辑,但开发和调试成本相对较高。 ### 主题与样式集成 在 UI 风格方面,Unity 编辑器倾向于使用深色系风格,因此可以参考 DarkUI 或 Material Design 风格库来统一界面视觉风格。例如,Material Design 是一个广泛使用的 UI 设计规范,可通过 Material Design Toolkit 实现 WPF 中的主题样式绑定 [^2]。 ### Docking 功能实现 对于具有多个面板的编辑器界面,Docking 是提升用户体验的重要功能。在 WinForms 中,DockPanel Suite 是一个成熟的开源方案,支持灵活的停靠布局和面板管理 [^1]。对于 WPF,则可以使用 Dragablz 或 Material Design Toolkit 提供的停靠控件实现类似功能 [^3]。 ### 示例:使用 DockPanel Suite 实现 WinForms 停靠功能 ```csharp using WeifenLuo.WinFormsUI.Docking; public class DockingForm : Form { private DockPanel dockPanel; public DockingForm() { dockPanel = new DockPanel(); dockPanel.Dock = DockStyle.Fill; this.Controls.Add(dockPanel); DockContent content1 = new DockContent(); content1.Text = "面板 1"; content1.Show(dockPanel, DockState.DockLeft); DockContent content2 = new DockContent(); content2.Text = "面板 2"; content2.Show(dockPanel, DockState.DockRight); } } ``` 该方案可以实现多面板布局、拖拽停靠等高级功能,适用于构建功能复杂的 Unity 编辑器插件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值