🎡

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 视图的一般方法是:

GUILayout

GUILayoutGUI 的关系与 EditorGUILayoutEditorGUI 一样,前者为自动布局,后者一般需要额外提供一个具体绘制的区域。

GUILayout 中很多静态方法与 EditorGUILayout 用法类似,例如下表中的对比:

GUILayout 与 EditorGUILayout 类似静态方法

EditorGUILayout 中类似的静态方法GUILayout 中的静态方法用法
BeginHorizontal, EndHorizontal, BeginVertical, EndVerticalBeginHorizontal , EndHorizontal , BeginVertical , EndVertical开启/关闭水平或垂直绘制模式
BeginScrollView, EndScrollViewBeginScrollView , EndScrollView绘制滚动视图
SliderHorizontalSlider , VerticalSlider生成可拖动的滑动条
LabelFieldLabel
SpaceSpace添加空白区域
PasswordFieldPasswordField生成密码区域
TextFieldTextArea , TextField生成一块显示可编辑文本的区域
Toggle, ToggleLeftToggle生成一个开关

GUILayout 也包含一些特有的控制区域:

GUILayout 可以生成的控制区域

Name示例程序说明
BeginArea, EndArea在 Scene 视图中开启一个指定的绘制区域
Box生成一个自动布局的 box
Button, RepeatButton生成按钮
FlexibleSpace生成一个自适应尺寸的空白区域
SelectionGrid生成一个选择网格
Toolbar生成一个工具栏
HorizontalScrollbar, VerticalScrollbar生成水平或竖直的滚动条
Window生成一个窗口

此外 GUILayout 还包含一些静态方法,可用于定义 GUIOption 类型的变量:例如 GUILayout.HeightGUILayout.Width 定义固定的宽高,GUILayout.ExpandHeightGUILayout.ExpandWidth 定义是否自动延展,GUILayout.MaxHeightGUILayout.MaxWidth 定义宽高的最值等等。以下示例详细展示了这类静态方法的用法:

GUI

EditorGUIEditorGUILayout 的关系一样,GUI 也包含大量与 GUILayout 相似的方法,只需额外提供一个指定的绘制位置和尺寸。以下列举了 GUI 中特有的方法:

GUI

Name说明
BeginGroup, EndGroup生成一个控件组
BringWindowToBack, BringWindowToFront将某个窗口移到最前或最后
DragWindow使窗口可以用鼠标拖动
DrawTexture在一个矩形区域内绘制纹理
DrawTextureWithTexCoords根据给定的纹理坐标绘制矩形
FocusControl, GetNameOfFocusedControl, SetNextControlName将焦点移至某个控件上/获取焦点控件的名字/设置下一个控件的名字
FocusWindow, UnfocusWindow
ModalWindow, Window生成一个模态或普通弹出窗口
ScrollTo移动到滚动视图中的某一区域