OnSceneGUI 和 GUI
GUILayout
OnSceneGUI
如前所述,Scene 视图的绘制由 Editor.OnSceneGUI
方法实现。例如在 Scene 视图中添加一个按钮:
using UnityEngine;
using UnityEditor;
[CustomEditor (typeof (Camera))]
public class SceneExtension : Editor {
private void OnSceneGUI () {
Handles.BeginGUI ();
GUILayout.BeginArea (new Rect (5, 5, 100, 100));
if (GUILayout.Button ("Button")) {
Debug.Log ("Button clicked.");
}
GUILayout.EndArea ();
Handles.EndGUI ();
}
}
可以看出扩展 Scene 视图的一般方法是:
- 扩展类继承于
Editor
,并且必须具有一个CustomEditor
属性,所以扩展 Scene 视图必须附加有对应的脚本或组件(例如这里的Camera
)
- 具体绘制在
OnSceneGUI
中完成,而且GUILayout
和GUI
必须作用在一组Handles.BeginGUI
和Handles.BeginGUI
之内,否则控件不会渲染
- 使用
GUILayout
时习惯上都会通过GUILayout.BeginArea
额外规定一个绘制的区域,如果不作规定,则绘制将会以整个 Scene 视图窗口为参照
- 其余和扩展 Inspector 视图或编辑器窗口同理
GUILayout
GUILayout
和 GUI
的关系与 EditorGUILayout
和 EditorGUI
一样,前者为自动布局,后者一般需要额外提供一个具体绘制的区域。
GUILayout
中很多静态方法与 EditorGUILayout
用法类似,例如下表中的对比:
GUILayout 与 EditorGUILayout 类似静态方法
EditorGUILayout 中类似的静态方法 | GUILayout 中的静态方法 | 用法 |
---|---|---|
BeginHorizontal, EndHorizontal, BeginVertical, EndVertical | BeginHorizontal , EndHorizontal , BeginVertical , EndVertical | 开启/关闭水平或垂直绘制模式 |
BeginScrollView, EndScrollView | BeginScrollView , EndScrollView | 绘制滚动视图 |
Slider | HorizontalSlider , VerticalSlider | 生成可拖动的滑动条 |
LabelField | Label | |
Space | Space | 添加空白区域 |
PasswordField | PasswordField | 生成密码区域 |
TextField | TextArea , TextField | 生成一块显示可编辑文本的区域 |
Toggle, ToggleLeft | Toggle | 生成一个开关 |
GUILayout
也包含一些特有的控制区域:
GUILayout 可以生成的控制区域
Name | 示例程序 | 说明 |
---|---|---|
BeginArea, EndArea | 在 Scene 视图中开启一个指定的绘制区域 | |
Box | 生成一个自动布局的 box | |
Button, RepeatButton | 生成按钮 | |
FlexibleSpace | 生成一个自适应尺寸的空白区域 | |
SelectionGrid | 生成一个选择网格 | |
Toolbar | 生成一个工具栏 | |
HorizontalScrollbar, VerticalScrollbar | 生成水平或竖直的滚动条 | |
Window | 生成一个窗口 |
此外 GUILayout
还包含一些静态方法,可用于定义 GUIOption
类型的变量:例如 GUILayout.Height
和 GUILayout.Width
定义固定的宽高,GUILayout.ExpandHeight
和 GUILayout.ExpandWidth
定义是否自动延展,GUILayout.MaxHeight
和 GUILayout.MaxWidth
定义宽高的最值等等。以下示例详细展示了这类静态方法的用法:
GUI
与 EditorGUI
和 EditorGUILayout
的关系一样,GUI
也包含大量与 GUILayout
相似的方法,只需额外提供一个指定的绘制位置和尺寸。以下列举了 GUI
中特有的方法:
GUI
Name | 说明 |
---|---|
BeginGroup, EndGroup | 生成一个控件组 |
BringWindowToBack, BringWindowToFront | 将某个窗口移到最前或最后 |
DragWindow | 使窗口可以用鼠标拖动 |
DrawTexture | 在一个矩形区域内绘制纹理 |
DrawTextureWithTexCoords | 根据给定的纹理坐标绘制矩形 |
FocusControl, GetNameOfFocusedControl, SetNextControlName | 将焦点移至某个控件上/获取焦点控件的名字/设置下一个控件的名字 |
FocusWindow, UnfocusWindow | |
ModalWindow, Window | 生成一个模态或普通弹出窗口 |
ScrollTo | 移动到滚动视图中的某一区域 |