Unity编辑器扩展——自定义Scene窗口

本文介绍了如何在Unity中利用Editor类和EditorWindow类扩展脚本,通过重写OnSceneGUI方法来绘制3D物体如PositionHandle、RotationHandle和RadiusHandle,以及2D控件如Label、Button等。通过GUILayout和EditorGUILayout,可以方便地在Inspector和Scene视图中创建自定义界面。此外,还展示了如何在场景窗口中绘制2D GUI元素。

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

一:Editor类

Editor类和EditorWindow类都继承自同一个基类:ScriptableObject,他们都可以针对某种脚本类来进行操作
Editor类只能对指定脚本进行扩展,Inspector面板的显示,或变量在Scene视图中的可视化

使用到的类:
——GUILayout:绘制各种2D控件,比如按钮、文本、可折叠列表,以及对它们的分组和排版。这些控件既可以绘制在Editor类里,也可以绘制在EditorWindow里
——EditorGUILayout:与GUILayout类似,但是提供更多的预定义控件
——GUIUtility:绘制自定义的2D控件,比如进度条、对话框、打开文件夹
——EditorGUIUtility:绘制自定义的2D控件,比如进度条、对话框、打开文件夹
——Handles:绘制3D物体,比如线、面、扇形、方块、圆锥

重写OnSceneGUI方法进行绘制


二:准备

新建一个脚本MyHandles挂载到场景中的任意游戏物体身上(只有选择了挂载此脚本的游戏物体才会在执行OnSceneGUI方法)
新建场景扩展脚本SceneEditor并获取到MyHandles对象

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MyHandles))]
public class SceneEditor : Editor
{
    MyHandles handles;
    private void OnEnable()
    {
        handles = target as MyHandles;
    }
}

三:代码实现

——标签Label

private void OnSceneGUI()
{
    Handles.Label(handles.transform.position, "this is cube");
}

——球形区域RadiusHandle

private void OnSceneGUI()
{
    Handles.RadiusHandle(handles.transform.rotation, handles.transform.position, 1);
}

——位置轴PositionHandle

private void OnSceneGUI()
{
    for (int i = 0; i < handles.trans.Length; i++)
    {
        Handles.PositionHandle(handles.trans[i].position, handles.trans[i].rotation);
    }
}

——旋转轴RotationHandle

private void OnSceneGUI()
{
    for (int i = 0; i < handles.trans.Length; i++)
    {
        Handles.RotationHandle(handles.trans[i].rotation, handles.trans[i].position);
    }
}

——绘制线段DrawLine

private void OnSceneGUI()
{
    Handles.DrawLine(handles.trans[0].position, handles.trans[1].position);
}

——绘制2D控件
在场景窗口中绘制2D控件必须声明在Handles.BeginGUI()和Handles.EndGUI()内

private void OnSceneGUI()
{
    Handles.BeginGUI();
    GUIWindow();
    Handles.EndGUI();
}

private void GUIWindow()
{
    GUILayout.Window(1, new Rect(50, 50, 0, 0), id =>
       {
           GUI.contentColor = Color.white;
           EditorGUILayout.LabelField("this is window");
           EditorGUILayout.ColorField(Color.cyan);
           EditorGUILayout.Toggle("Toggle", false);
           GUILayout.Button("Button");
           GUI.DragWindow();
       }, "Window");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Bug.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值