UEDL8——Handles公共类

本章代码关键字

1
2
3
Handles                        //处理类,可以为某个脚本对象或者自定义编辑器窗口拓展在Scene窗口上的显示,可以自定义绘制内容
OnSceneGUI() { } //为某个脚本对象扩展在Scene窗口上的显示时,就需要在该方法内编写绘制逻辑
SceneView.duringSceneGui //为某个自定义编辑器窗口扩展在Scene窗口上的显示时,就需要将实现了绘制逻辑的方法添加到该事件内,窗口关闭时需要移除

Handles

Handles​类提供了很多API,让我们可以在Scene窗口中绘制我们的自定义内容
它和GUI​、EditorGUI​类似,只不过它专门提供给Scene窗口使用

想要在Scene窗口中显示自定义内容,我们需要在对应的响应函数中进行处理

Scene窗口拓展功能,主要是提供给自定义脚本和自定义窗口的,我们采用对应的规则进行处理
便可以在之后的学习中利用场景更新响应函数来自定义一些Scene窗口的显示内容

Handles​的更多内容可看:

Scene窗口更新响应函数

关键点(前两个步骤 和自定义Inspector窗口显示内容一致):

  1. 单独为某一个脚本实现一个自定义脚本,并且脚本需要继承Editor
    一般该脚本命名为 自定义脚本名 + Editor

    假设我们要对下面这个脚本进行Scene窗口显示的拓展:

  2. 在该脚本前加上特性
    命名空间:UnityEditor
    特性名:CustomEditor(想要自定义脚本类名的Type)

  3. 在该脚本中实现void OnSceneGUI()​方法,该方法会在我们选中挂载自定义脚本的对象时自动更新

    注意:只有选中时才会执行,没有选中不执行

假设我们要为Lesson26​拓展在Scene窗口的显示,我们就需要声明这样的一个类

1
2
3
4
5
6
7
8
9
10
11
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Lesson26))]
public class Lesson26Editor : Editor
{
private void OnSceneGUI()
{
Debug.Log("Scene窗口拓展相关逻辑");
}
}

值得一提的是,即使选中了挂载自定义脚本的对象,OnSceneGUI()​也不一定是每帧都执行

自定义窗口中监听Scene窗口更新响应函数

我们不仅可以为一个脚本拓展在Scene窗口上的显示,还可以为自定义编辑器窗口拓展Scene窗口上的显示

可以在自定义窗口显示时:

  • 监听更新事件:SceneView.duringSceneGui += 事件函数
  • 窗口隐藏或销毁时移除事件:SceneView.duringSceneGui -= 事件函数

假设我们要为Lesson26Window​这个编辑器窗口拓展Scene窗口上的显示,就需要这样实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using UnityEditor;
using UnityEngine;

public class Lesson26Window : EditorWindow
{
//窗口开启入口
[MenuItem("Unity编辑器拓展/Lesson26/打开Scene拓展窗口")]
private static void OpenLesson26()
{
Lesson26Window window = EditorWindow.GetWindow<Lesson26Window>();
window.Show();
}

private void OnEnable()
{
//窗口显示时开始监听Scene窗口更新
SceneView.duringSceneGui += SceneUpdate;
}

private void OnDestroy()
{
//窗口销毁时移除对Scene窗口更新的监听
SceneView.duringSceneGui -= SceneUpdate;
}

//当Scene窗口更新时会执行的方法
private void SceneUpdate(SceneView sceneView)
{
Debug.Log("自定义窗口拓展Scene相关内容");
}
}

当自定义窗口显示时,就会执行添加到SceneView.duringSceneGui​事件内的方法,该方法要有一个SceneView​参数

Handles类的具体使用

  • 文本、线段、虚线
  • 弧线、圆、立方体,几何体
  • 移动、旋转、缩放
  • 自由移动、自由旋转
  • 显示GUI