概述
GUI系统主要部分:
OnGUI回调
(这个回调是用于处理一切与GUI相关的逻辑)Event
,这是和GUI系统紧密关联的GUIStyle
定义了一种样式,实际上是负责任意GUI的绘画GUISkin
一组预定义的默认样式。GUIUtility
、EditorGUIUtility
OnGUI
由引擎自动调用。通常每帧至少两次,但可能由于其他事件的发生而被多次调用。
OnGUI看名字意思类似于“做GUI的东西”,但事实上它是一个事件处理器的回调。
Event
事件类信息事件的一般在OnGUI处理。只有一个静态成员 Event.current,这个属性保存了当前处理的EventType。
以下是几种不同类型的事件:
Mouse events
MouseDown, MouseUp, MouseMove(editor only), MouseDrag, ScrollWheel等。
Keyboard events
KeyDown、KeyUp。
注意:不同于 Input.GetKeyDown / Up ,这些事件是映射操作系统键盘事件。所以当你按住一个键的时候,这个事件的调用频度是取决去系统的。这对于文本编辑器是很重要的。The Repaint event
绘制GUI上的元素。
The Used event type
当你的控制器在处理事件的时候,不想让其他地方也受到这个事件的影响,可以采用 Use 的方式来“吃掉”这个事件。
MousePosition
持有鼠标在GUI位置坐标。GUI坐标与屏幕坐标不同。GUI的原点在左上角,屏幕坐标原点在左下角。GUIUtility 里有提供API来转换这个两者的坐标系
Button
有效的鼠标事件以及鼠标索引。(0-鼠标左键、1-鼠标中键、2-鼠标右键)
Modifiers
持有关于Shift, Alt, Ctrl 这些按键的信息。
KeyCode
有效的键盘事件,有键被按下/释放
一些额外的修饰键的快捷键之类的东西。
GUIStyle
正如之前提到的
GUIStyle
负责渲染到屏幕上的控制。当repaint event
被检测到的时候,GUI
就会调用绘制功能。GUIStyle
由不同GUIStyleStates
组成,但其中只有一个是“激活”的。使用哪个种是由什么画函数被调用时,所传递的参数,如果当前控制键盘焦点。
一个GUIStyle会产生0到3个drawcall。大多数的试用情景:
- 通常是用来定义如何按钮/文本框/…通常的样子。
- 一些在
GUIContent
中使用到的图片
GUISkin
正如之前所说,只是
GUIStyle
的集合。不用于GUIStyle
,GUISkin
可以很容易的作为资源文件存放在项目中。
GUI vs GUILayout
基本上
GUILayout
只是一个GUI
控件的扩展。大多数GUILayout
函数只是调用GUI
相当于函数添加布局。“正常”的GUI功能完全忽略了布局的事件。GUILayout
函数使用一个内部系统,建立布局组织收集所有控件布局在一组事件和重新油漆事件被调用之前Unity
分配的可用空间根据多少空间每一个控制要求。
EditorGUI(Layout) vs GUI(Layout)
EditorGUI
和EditorGUILayout
只是扩展GUI
和GUILayout
类只用于编辑器脚本位于UnityEditor.dll
。这两个类不作为GUI
和GUILayout
的替代。他们只是提供额外的控制,这是有用的在脚本编辑器定制检查员或EditorWindows
。