0x00
0x01
- 什么是IMGUI?
0x02
- IMGUI如何处理Event?
- Control ID是什么?
Every Event-uality
Event.current.type
获得当前事件,Evnet.current.GetTypeForControl()
获得当前
0x03
- Editor、EditorWindow、PropertyDrawer、GUI、EditorGUI都有什么功能?
GUI与EditorGUI区别在于GUI可以作为运行时工具构建到游戏中,而EditorGUI只能在编辑环境下使用。
GUILayout和EditorGUILayout可以用来自动布局。
EditorWindow用来派生创建自定义编辑器窗口。在代码触发显示后,可以实现工具的GUI代码显示窗口内容(OnGUI()
)。
以下内容来自Unity文档,即时模式GUI(IMGUI)。
扩展GameView
运行时可以在继承了MonoBehaviour的脚本中,通过OnGUI()
方法启动,Unity每帧都会调用OnGUI()
方法,无需显式创建和销毁GUI控件。
坐标系基于左上角(关于屏幕坐标左上角为(0, 0),向右向下为正)。
声明控件的关键信息:Type (Position, Content)
Type
指的是控件类型(Control Type),过调用Unity的GUI类或 GUILayout类中的函数来声明该类型。
Position
是所有GUI控件函数的第一个参数,由Rect(左侧坐标, 顶部坐标, 宽度, 高度)
函数描述。
所有这些值都以整数提供,对应于像素值。所有UnityGUI控件均在屏幕空间(Screen Space)中工作,屏幕空间表示发布时的游戏播放器的分辨率尺寸(以像素为单位,可由Screen.width
,Screen.height
获得)。
Content
指的是与控件一起显示的实际内容,通常是文本或图像(Texture)。
1 | GUI.Label (new Rect (0,0,100,50), "This is the text string for a Label Control"); |
可提供GUIContent对象作为Content参数,并提供更加复杂的显示功能:
- 定义要在GUIContent中显示的字符串和图像。
1 | Texture2D icon; |
- 定义鼠标悬停时显示的提示(Tooltip)
GUIContent()
创建的Tooltip可以通过GUI.tooltip
获取,并通过GUI.Label()
显示。 - 同时显示字符串,图标和提示。
控件类型
以下内容来自Unity文档,控件
- Label
- Button
- RepeatButton(保持点击状态的每一帧都将执行)
- TextField(单行)
- TextArea(多行)
- Toggle
- Toolbar(一行Button,一次只能有一个Button处于激活状态)
- SelectionGrid(多行Toolbar)
- HorizontalSlider(水平滑钮)
- VerticalSlider(垂直滑钮)
- HorizontalScrollbar(用于导航ScrollView控件)
- VerticalScrollbar
- ScrollView(需要两个Rect和2D矢量作为参数)
- Window(可拖动的控件容器)
当用户执行了操作时,GUI.changed
结果将获得true,因此可以轻松验证用户输入。
1 | /* GUI.changed 示例 */ |
0x04
- 如何实现MyCustomSlider显示自定义滑动条?
- FocusType?
1 | public static float MyCustomSlider(Rect controlRect, float value, GUIStyle style) |
最后,简单的IMGUI control就实现好了,MyCustomSlider可以用在自定义Editors、PropertyDrawers、editorWindows等等。
0x05
- SceneView的辅助UI元素,编辑器工具制作?
Handles类,用来在SceneView中绘制3D GUI。
0x06
- PropertyDrawer如何使用?
- 自定义Serializable类的每个实例的GUI。
- 通过自定义的属性特性来自定义脚本成员的GUI。
对现有的可显示字段进行排版。
0x07
- TreeView如何使用?
TreeView不是树(数据结构)。可以使用所需的任何树数据结构来构造TreeView(c#或Unity Transform层级视图)
- TreeView
- TreeViewItem
TreeViewState - 可序列化的状态
BuildRoot
- 创建TreeView的抽象方法,每次调用Reload
时都会调用此方法BuildRows
- 虚拟方法,处理展开的行
0x08
- Unity
DrawDefaultInspector();
是怎么绘制Editor的?
可以使用VS反编译出代码,通过serializedObject.GetIterator()
得到的迭代器,使用EditorGUILayout.PropertyField(iterator, true)
通过ScriptAttributeUtility.GetHandler(property).OnGUILayout()
方法绘制