EditorWindow及IMGUI的各个控件的学习
此篇主要讲GUILayout的各个控件的使用方法
*请先using UnityEditor
前言
(长话短说)学习课程做的笔记 课程地址:在这
EditorWindow说明
(摘自文档)
从此类派生以创建编辑器窗口。
创建自己的自定义编辑器窗口,这些窗口可以自由浮动,也可以作为选项卡停靠,就像 Unity 界面中的原生窗口一样。
通常使用菜单项打开编辑器窗口。
EditorWindow使用方法
窗口的打开和简单的绘制
public class WindowName : EditorWindow
{
[MenuItem("path")]
static void OpenGUILayoutExample()
{
GetWindow<WindowName>().Show();
}
private void OnGUI()
{
GUILayout.Label("Hello IMGUI");
}
}
使用MenuItem特性调用打开窗口的静态方法,MenuItem相关的知识请看之前的文档……
path为菜单路径,之后不再说明了,WindowName为窗口的这个类名
(ps:别问我为什么不写个正确的路径和类名)
首先需要让类继承UnityEditor.EditorWindow,使其具有窗口的属性
使用GetWindow<WindowName>().Show()来显示这个窗口
窗口内的绘制方式: 在OnGUI方法中使用IMGUI的API进行UI绘制
注:IMGUI是Immediately mode GUI (即时绘制),EditorWindow是IMGUI的其中一个载体
GUILayout UI组件使用
写在OnGUI()方法中
1. Label 文本标签
private void OnGUI()
{
GUILayout.Label("message");
}
message 为显示的字符串
2. TextField 输入框
string mTextFieldValue;
private void OnGUI()
{
mTextFieldValue = GUILayout.TextField(mTextFieldValue);
}
TextField方法中的参数为文本框的默认值,当文本发生变化时方法返回文本框内的字符串
上面的示例代码表示使用一个变量存储文本框内的字符串
3.TextArea输入框
string mTextAreaValue;
private void OnGUI()
{
mTextAreaValue = GUILayout.TextArea(mTextAreaValue);
}
与TextField基本一致,但是支持回车换行
4. PasswordField密码输入框
string mPasswordFieldValue="";
private void OnGUI()
{
mPasswordFieldValue = GUILayout.PasswordField(mPasswordFieldValue,'*');
}
第一个参数为默认值,第二个参数为掩码
输入的字母会变成掩码显示出来
注意:默认值必须赋值,为空会报错
5.Button 按钮
private void OnGUI()
{
if (GUILayout.Button("这是一个按钮"))
{
Debug.Log("点击了按钮");
}
}
参数为按钮中的文字,当按钮被点击会返回true,因此判断其返回值为true时可以调用所需方法
注:点击一次调用一次方法(松开鼠标时调用)
6.RepeatButton 循环按钮
private void OnGUI()
{
if (GUILayout.RepeatButton("这是一个循环按钮"))
{
Debug.Log("按住了按钮");
}
}
注意:文档里写的是按下会一直调用方法,经测试在EditorWindow中会出点问题,不会一直调用,仅在游戏脚本中使用才会正常实现。怀疑是MonoBehavior和EditoriaWindow两个类继承的不是同一个类且OnGUI方法实现不一样导致(注意只是我个人猜测,实际我也不知道是为什么)。
7. Horizontal/Vertical方向布局组
在布局组中的控件会根据布局依次放置
示例代码如下:
void OnGUI()
{
GUILayout.BeginHorizontal();
GUILayout.Button("按钮1");
GUILayout.Button("按钮2");
GUILayout.TextField("输入框1");
GUILayout.EndHorizontal();
}
使用GUILayout.BeginHorizontal()和GUILayout.EndHorizontal()来使其之间的控件布局为水平布局。
同理,使用GUILayout.BeginVertical()和GUILayout.EndVertical()来使其之间的控件布局为水平布局。
8. Box自动布局框
创建一个包含静态文本或图像但不包含其他 GUI 控件的框
示例代码如下(抄了下文档里的代码):
Texture tex;
void OnGUI()
{
if (!tex)
{
Debug.LogError("图像缺失");
}
GUILayout.Box(tex);
GUILayout.Box("自动布局标签");
}
9. ScrollView滚动视图
生成一个自动布局的滚动视图
自动布局滚动视图和方向布局组一样可以存放任何内容
如果内容显示大小大于滚动视图的大小则显示滚动条
示例代码如下:
Vector2 scrollPosition;
void OnGUI()
{
scrollPosition = GUILayout.BeginScrollView(scrollPosition);
GUILayout.Label("这是一个标签");
GUILayout.Button("这是一个按钮");
GUILayout.Button("这是一个按钮");
GUILayout.Button("这是一个按钮");
GUILayout.Button("这是一个按钮");
GUILayout.Button("这是一个按钮");
GUILayout.Button("这是一个按钮");
GUILayout.EndScrollView();
}
与方向布局组的使用方法一样,需要用 GUILayout.BeginScrollView()和GUILayout.EndScrollView()来建立滚动视图的范围。
需要定义一个Vector2变量scrollPosition存放显示的位置
10 .HorizontalSlider/VerticalSlider 水平/竖直滑动条
生成一个拖动滑动条,用于在最小值和最大值之间更改某值,返回一个float值
示例代码如下:
float mSliderValue;
float leftValue = 0f;
float rightValue = 1f;
void OnGUI()
{
mSliderValue = GUILayout.HorizontalSlider(mSliderValue, leftValue, rightValue);
}
第一个参数为默认值,第二个参数和第三个参数分别为左边的值和右边的值
11. Area GUI区域
在一个固定的屏幕区域中开始 GUI 控件的 GUILayout 块
也就是说无视当前的布局,在对应的区域中 生成 一个GUILayout 块
示例代码如下:
void OnGUI()
{
Rect rect = new Rect(10, 90, 100, 100);
GUILayout.BeginArea(rect);
GUI.Button(new Rect(0, 0, 100, 50), "按钮1");
GUI.Button(new Rect(0, 50, 100, 50), "按钮2");
GUILayout.EndArea();
GUILayout.Button("按钮3");
GUILayout.Button("按钮4");
}
使用GUILayout.BeginArea()和GUILayout.EndArea()在代码中确定这个块中包含哪些控件
rect为对应的位置和大小
注意:GUILayout.BeginArea()和GUILayout.EndArea()不能嵌套使用
12. WIndow窗口
创建一个对自身内容进行自动布局的弹出窗口
代码如下(抄文档里的):
Rect windowRect = new Rect(20, 20, 120, 50);
void OnGUI()
{
windowRect = GUILayout.Window(0, windowRect, DoMyWindow, "WindowName");
}
void DoMyWindow(int windowID)
{
if (GUILayout.Button("Hello World"))
{
Debug.Log("Got a click");
}
}
在EditorWindow里面应该是用不了,我个人测试是只能用在游戏脚本中
DoMyWindow为创建GUI的方法,需要接受id这个参数
13.ToolBar 工具栏
创建一个工具栏,每个栏目被点击时会返回选择的项对应的索引
示例代码如下:
private int mCurrentToolbarIndex;
void OnGUI()
{
mCurrentToolbarIndex=GUILayout.Toolbar(mCurrentToolbarIndex, new[] { "1", "2", "3", "4", "5" });
}
需要一个变量mCurrentToolbarIndex来存储工具栏的当前选择项索引,数组存放各项的文字。
14.Toggle 勾选项
创建一个打开/关闭的开关按钮(我个人喜欢叫它勾选项)
示例代码如下:
private bool mToggleValue = false;
void OnGUI()
{
mToggleValue=GUILayout.Toggle(mToggleValue, "点击我");
}
返回值为开关按钮的新值,因此使用一个变量保存它的值。
15. Space空白元素
在当前布局组中插入空白元素。
空白元素的方向取决于当前所在的布局组。如果在垂直组中,空白元素将是垂直的。
void OnGUI()
{
GUILayout.Button("1");
GUILayout.Space(100);
GUILayout.Button("2");
}
补充:使用GUILayout.FlexibleSpace()可以生成一个当前布局中能使其他控件压缩成最小的的空格,这个空格可以和以下说明的宽高,最小最大宽高等属性搭配在一起使用
16. Width/Height 宽高
用于设置控件的宽和高
示例代码如下:
void OnGUI()
{
GUILayout.Button("1",GUILayout.Width(150), GUILayout.Height(150));
GUILayout.FlexibleSpace();
GUILayout.Button("2", GUILayout.Width(150), GUILayout.MinHeight(100));
}
使用MinWidth,MaxWidth,MinHeight,MaxHeight可以调整控件的宽高最大值最小值
17.SelectionGrid选择网格
创建一个选择网格,返回所选的按钮索引(和ToolBar基本一致,但是可以多行显示按钮)
参考代码如下:
private int mSelectedGridIndex;
privte int xCount=2;
void OnGUI()
{
mSelectedGridIndex=GUILayout.SelectionGrid(mSelectedGridIndex, new[] { "1", "2", "3", "4", "5" }, xCount);
}
xCount表示一行显示几个按钮
其他说明
四种IMGUI渲染的API
Unity 提供了 四种IMGUI渲染的API,分别是:
- GUILayout:自动布局、支持运行时
- GUI:需要设置坐标和尺寸、支持运行时
- EditorGUILayout 自动布局、仅支持编辑器
- EditorGUI 需要设置坐标和尺寸、仅支持编辑器
文档
GUILayout文档地址
|