常用API总结"/>
IMGUI常用API总结
文章目录
- 一、IMGUI简介
- 二、控件(组件)相关API
- Type相关
- Content相关
- 三、布局相关API
- 1.固定布局与自动布局
- 2.GUI的Group
- 3.GUILayout的Area和Group
- 4. 空白元素
- 5.控件扩展
- 四、样式相关API
- 五、事件相关API
- 参考
一、IMGUI简介
“即时模式”GUI 系统(也称为 IMGUI)是一个完全独立的功能系统,不同于 Unity 基于游戏对象的主 UI 系统。IMGUI 是一个代码驱动
的 GUI 系统,主要用作程序员的工具。为了驱动该系统,需在实现脚本上调用 OnGUI 函数。例如,以下代码:
void OnGUI() {if (GUILayout.Button("Press Me"))Debug.Log("Hello!");
}
将显示如下所示的按钮:
二、控件(组件)相关API
Unity 的 IMGUI 控件使用一个名为 OnGUI()
的特殊函数。只要启用包含脚本,就会在每帧调用 OnGUI() 函数,就像 Update() 函数一样。
GUI.Box (Rect (10,10,100,90), “Loader Menu”);
将显示一个标题文本为 “Loader Menu” 的 Box 控件。该语句遵循典型的 GUI 控件声明模式。
由于每帧都会调用 OnGUI() 代码,因此无需显式创建和销毁 GUI 控件。声明控件的行与创建控件的行是同一行。如果需要在特定时间显示控件,可以使用任何类型的脚本逻辑来执行此操作。
声明 GUI 控件时,需要三段关键信息:
Type (Position, Content)
可以看到,此结构是一个带有两个参数的函数。
Type
Type 是指 Control Type(控件类型)__;通过调用 Unity 的 GUI 类或 GUILayout 类中的函数来声明该类型(在本指南的布局模式部分对此进行了详细讨论)。例如,__GUI.Label() 将创建非交互式标签。本指南稍后的控件部分将介绍所有不同的控件类型。
Position
Position 是所有 GUI 控件函数中的第一个参数。此参数本身随附一个 Rect() 函数。Rect() 定义四个属性:__最左侧位置、最顶部位置、总宽度、总高度。所有这些值都以__整数__提供,对应于像素值。所有 UnityGUI 控件均在__屏幕空间 (Screen Space) 中工作,此空间表示已发布的播放器的分辨率(以像素为单位)。
坐标系基于左上角。Rect(10, 20, 300, 100) 定义一个从坐标 10,20 开始到坐标 310,120 结束的矩形。值得再次强调的是,Rect() 中的第二对值是总宽度和高度,而不是控件结束的坐标。这就是为什么上面提到的例子结束于 310,120 而不是 300,100。
可使用 Screen.width 和 Screen.height 属性来获取播放器中可用的屏幕空间的总尺寸。
Content
GUI 控件的第二个参数是要与控件一起显示的实际内容。通常会希望在控件上显示一些文本或图像。要显示文本,请将字符串作为 Content 参数传递。要显示图像,请声明 Texture2D 公共变量,并将变量名称作为 Content 参数传递。
也可提供 GUIContent 对象作为 Content 参数,并定义要在 GUIContent 中显示的字符串和图像。此外,还可在 GUIContent 中定义__工具提示 (Tooltip)__,当鼠标悬停在 GUI 上时将工具提示显示在 GUI 中的其他位置。
Type相关
-
Label:以Label为例,常用的函数有:
//在Editor Window、Game窗口绘制的 GUI.Label() GUILayout.Label() //在Editor Window绘制的 EditorGUI.LabelField() EditorGUILayout.LabelField() //在Scene窗口绘制的 Handles.Label()
-
Button
-
RepeatButton
-
TextField
-
TextArea
-
Toggle
-
Toolbar
-
SelectionGrid
-
HorizontalSlider
-
VerticalSlider
-
HorizontalScrollbar
-
VerticalScrollbar
-
ScrollView
-
Window
-
ObjectField
-
MaskField
Content相关
三、布局相关API
1.固定布局与自动布局
使用 IMGUI 系统时,可使用两种不同的模式来排列和组织 UI:固定布局模式
和自动布局模式
。
使用自动布局时有两个主要的不同之处:
- 使用 GUILayout 而不是 GUI
- 自动布局控件不需要 Rect() 函数
不必使用一种布局模式来替代另一种布局模式,可在同一 OnGUI() 函数中同时使用这两种模式。
在固定布局中,可将不同的控件放入__组__
中。组内的所有控件将根据组的左上角而不是屏幕的左上角进行定位。
2.GUI的Group
void OnGUI () {// 在屏幕中央创建一个组GUI.BeginGroup (new Rect (Screen.width / 2 - 50, Screen.height / 2 - 50, 100, 100));// 现在所有矩形都调整到该组。(0,0) 是该组的左上角。//我们将创建一个框形,以便能看到该组在屏幕上的位置。GUI.Box (new Rect (0,0,100,100),"Group is here");GUI.Button (new Rect (10,40,80,30), "Click me");// 结束我们上面开始的组。记住这一点非常重要!GUI.EndGroup ();}
3.GUILayout的Area和Group
在自动布局中,可将不同的控件放入__区域
、水平组__
和__垂直组__
中。在自动布局模式下,不需要在控制级别定义绘制控件的屏幕区域。控件将自动放置在包含该控件的区域的最左上角。此区域可能是指屏幕。此外也可以创建手动定位的区域。
在一个区域内,具有可见元素(如按钮和框形)的控件会将宽度拉伸到该区域的整个长度。
public class GUITest : MonoBehaviour {private float sliderValue = 1.0f;private float maxSliderValue = 10.0f;void OnGUI(){// 将所有控件包裹在指定的 GUI 区域中GUILayout.BeginArea (new Rect (0,0,200,60));// 开始单个水平组GUILayout.BeginHorizontal();// 正常放置按钮if (GUILayout.RepeatButton ("Increase max\nSlider Value")){maxSliderValue += 3.0f * Time.deltaTime;}// 在按钮旁边垂直排列另外两个控件GUILayout.BeginVertical();GUILayout.Box("Slider Value: " + Mathf.Round(sliderValue));sliderValue = GUILayout.HorizontalSlider (sliderValue, 0.0f, maxSliderValue);// 结束这些组和区域GUILayout.EndVertical();GUILayout.EndHorizontal();GUILayout.EndArea();}}
4. 空白元素
public static void Space (float pixels);
在当前布局组中插入空白元素。
空白元素的方向取决于发出命令时当前所在的布局组。如果在垂直组中,空白元素将是垂直的。
5.控件扩展
//传递给控件以允许或禁止水平扩展的选项。如果为 true,则封闭的 UI 元素可以扩展以填充可用的水平宽度。
public static GUILayoutOption ExpandWidth (bool expand);
//传递给控件以允许或禁止垂直扩展的选项。
public static GUILayoutOption ExpandHeight (bool expand);
四、样式相关API
控件外观由 GUIStyle
决定。默认情况下,如果创建控件时未定义 GUIStyle,则会应用 Unity 的默认 GUIStyle。此样式是 Unity 的内部样式,可在已发布的游戏中将此样式用于快速原型设计,或者如果选择不对控件进行样式设置,则会采用此样式。
当有大量不同的 GUIStyle 可供使用时,可在单个 GUISkin
中定义这些样式。GUISkin 只不过是 GUIStyle 的集合。
方法一:将控件名称作为GUI控件函数的最后一个参数
所有 GUI 控件函数都有可选的最后一个参数:用于显示控件的 GUIStyle。如果忽略此参数,则会使用 Unity 的默认 GUIStyle。函数内部会将控件类型的名称作为字符串应用,因此 GUI.Button() 使用“button”样式,GUI.Toggle() 使用“toggle”样式,等等。若要覆盖控件的默认 GUIStyle,可将其指定为最后一个参数。
using UnityEngine;
using System.Collections;public class GUITest : MonoBehaviour {void OnGUI () {// 创建使用 "box" GUIStyle 的标签。GUI.Label (new Rect (0,0,200,100), "Hi - I'm a label looking like a box", "box");// 创建使用 "toggle" GUIStyle 的按钮GUI.Button (new Rect (10,140,180,20), "This is a button", "toggle");}
}
方法二:创建公共变量 GUIStyle
using UnityEngine;
using System.Collections;public class GUITest : MonoBehaviour {public GUIStyle customButton;void OnGUI () {// 创建按钮。将上面定义的 GUIStyle 作为要使用的样式传入GUI.Button (new Rect (10,10,150,20), "I am a Custom Button", customButton);}}
方法三:使用皮肤
using UnityEngine;
using System.Collections;public class GUITest : MonoBehaviour {public GUISkin mySkin;void OnGUI () {// 将该皮肤指定为当前使用的皮肤。GUI.skin = mySkin;// 创建按钮。此时将从分配给 mySkin 的皮肤获得默认的 "button" 样式。GUI.Button (new Rect (10,10,150,20), "Skinned Button");}
}
五、事件相关API
GUI.changed
参考
Unity中文手册:GUIScriptingGuide
更多推荐
IMGUI常用API总结
发布评论