文档原文:Immediate Mode GUI (IMGUI) - Unity Manual
IMGUI :即时模式 GUI
用途:
1、创建游戏内调试显示和工具。(在每帧都会调用的 OnGUI() 中使用)
2、为脚本组件创建自定义检视面板。
3、创建新的编辑器窗口和工具以扩展 Unity 本身。
一、IMGUI 基础知识
GUI 控件声明
关键:Type (Position, Content)。
1、Type:指 Control Type(控件类型),通常为 GUI 或 GUILayout 类中的函数。
2、Position:所有 GUI 控件函数中的第一个参数。类型为 Rect(int, int, int, int),含义:最左侧位置、最顶部位置、总宽度、总高度。均为屏幕空间下的像素值(屏幕宽高:Screen.width、Screen.height)。
3、Content:GUI 控件函数中的必要参数。类型为 string、Texture、GUIContent等(由具体控件决定),含义:要在控件上显示的内容和tooltip。
举例:GUI.Button (new Rect (10,10,200,20), "Meet the flashing button")
二、控件类型
GUI:https://docs.unity3d.com/cn/2020.3/ScriptReference/GUI.html
GUILayout:https://docs.unity3d.com/cn/2020.3/ScriptReference/GUILayout.html
三、使用 GUIStyle 自定义控件
1、GUIStyle 旨在模仿 Web 浏览器的层叠样式表 (CSS):分离内容和外观。
2、所有 GUI 控件函数都有可选的最后一个参数:用于显示控件的 GUIStyle。若忽略,则会使用 Unity 默认的 GUIStyle。
3、可将 GUIStyle 作为变量显示在Inspector上进行编辑。
4、GUIStyle 的属性可以动态更改。
四、GUISkin
1、GUISkin 是 GUIStyle 的集合,当有大量不同的 GUIStyle 可供使用时,可在单个 GUISkin 中定义这些样式。
2、创建 GUISkin: 菜单栏中选择 Assets > Create > GUI Skin。
3、应用 GUISkin 至全局:GUI.skin = customSkin。
五、IMGUI 固定布局模式
1、可以使用 GUI.BeginGroup + GUI.EndGroup 定义包含多个控件的屏幕区域。
2、Group内的所有控件将根据Group的左上角而不是屏幕的左上角进行定位。
3、Group可以嵌套。
六、IMGUI 自动布局模式
1、自动布局模式在创建时不需要 Rect() 参数。控件将自动放置在包含控件的Area或屏幕的最左上角。
2、可以使用 GUILayout.BeginArea + GUILayout.EndArea 定义有限空间的Area来包含多个控件。
3、Area中的可见控件会将宽度拉伸到该Area的整个长度。
4、可以使用 GUILayout.BeginHorizontal() + GUILayout.EndHorizontal() 定义水平组。水平组内的所有控件都将始终采用水平布局方式。
5、可以使用 GUILayout.BeginVertical() + GUILayout.EndVertical() 定义垂直组。垂直组内的所有控件都将始终采用垂直布局方式。
6、垂直组和水平组可以嵌套使用,以实现复杂的排列需求。(重点在于自顶向下分解区域)。
7、创建空间或组时,可以使用 GUILayoutOption 覆盖某些自动布局参数。 GUILayoutOption是以下函数的返回值:
GUILayout.Width(float) 固定宽度
GUILayout.MaxWidth(float) 最大宽度
GUILayout.MinWidth(float) 最小宽度
GUILayout.ExpandWidth(bool) 是否扩展宽度
GUILayout.Height(float) 固定高度
GUILayout.MaxHeight(float) 最大高度
GUILayout.MinHeight(float) 最小高度
GUILayout.ExpandHeight(bool) 是否扩展高度
*** 两种布局模式可以混用
七、扩展 IMGUI(类似制作预设,但是包装在方法中)
1、复合控件:即将(二)中的基本控件进行组合。同时显示、封装内部排列和交互。
2、可将复合控件统一整理至一个静态类中,方便各处复用。