一,EditorWindow
二,IMGUi 组件 - 也就是在OnGUi中绘制组件。
1. Label:文本标签
`GUILayout.Label(“Hello EditorWindow”);
2.TextField/TextArea/PasswordField: 输入框
using UnityEditor;
using UnityEngine;
public class GUILayoutExample : EditorWindow
{
[MenuItem("MyEditor/02/ShowWindow")]
static void Openwindow()
{
//开启一个界面
GetWindow<GUILayoutExample>().Show();
}
string m_TextFildStr;
string m_TextAreaStr;
//关于密码输入框,这个String必须存在一个默认值。否则会报错
string m_PasswordFieldStr = string.Empty;
private void OnGUI()
{
GUILayout.Label("TextField");
//需要一个指向修改的String ,这样才可以不断进行更改显示
//这是一个单行的基本文本框
m_TextFildStr = GUILayout.TextField(m_TextFildStr);
GUILayout.Label("TextArea");
//这是一个自动适应的文本框,它会随着字符串的长度缩放。
m_TextAreaStr = GUILayout.TextArea(m_TextAreaStr);
GUILayout.Label("PasswordField");
//Password Field 第一个为默认的字符串,也就是输入的字符串,第二个则是字符串的掩码,将字符串显示为什么。
m_PasswordFieldStr = GUILayout.PasswordField(m_PasswordFieldStr,'$');
}
}
效果
3.Button/RepeatButton: 按钮
GUILayout.Label("Button");
//当按下时触发内部代码
if (GUILayout.Button("ClickME"))
{
Debug.Log("Click");
}
GUILayout.Label("RepeatButton");
//当按下或抬起时都会触发内部代码
if (GUILayout.RepeatButton("RepeatButton"))
{
Debug.Log("RepeatButton");
}
4.Horizontal/Vertical: 横竖向方向布局
//两个方法,用来标记开始横向和结束横向 -- region内部代码同上
GUILayout.BeginHorizontal();
#region
GUILayout.EndHorizontal();
效果:这样会将代码中的组件放到一行之中。
//特性,可以使用语法块的形式将代码包含在其中,这样看起来更加清晰
GUILayout.BeginHorizontal();
{
#region
}
GUILayout.EndHorizontal();
同理,GUILayout.BeginVertical();的使用方式是一致的。
但是由于单独的GUILayout.BeginVertical();不好演示,所以多写了一点。
GUILayout.BeginVertical();
{
#region
GUILayout.BeginHorizontal();
{
GUILayout.Label("Button");
if (GUILayout.Button("ClickME"))
{
Debug.Log("Click");
}
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
{
GUILayout.Label("RepeatButton");
if (GUILayout.RepeatButton("RepeatButton"))
{
Debug.Log("RepeatButton");
}
}
GUILayout.EndHorizontal();
#endregion
}
GUILayout.EndVertical();
效果:
5.Box: 自动布局框
BoxTexture = (Texture2D)EditorGUILayout.ObjectField("MyTexture",BoxTexture,typeof(Texture2D),false);
GUILayout.Box("AutoLayout Box");
GUILayout.Box(BoxTexture);
这个组件可以用来自动缩放的显示文本和图片,为了方便演示,我使用了
Api: EditorGUILayout.ObjectField
来从外部获取一张图片。用来显示在GUILayout.Box中。
效果:
6.ScrollView: 滚动视图
private Vector2 m_ScrollPosition;
private void OnGUI()
{
m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition);
{
//内部为你自己的GUiLayer代码
}
GUILayout.EndScrollView();
}
效果:这个效果要在Editowindow 界面小于其内容才会出现。
6.1: GUILayout.HorizontalSlider Api
作用,横向拖拽条
代码:
//横向进度条 //float参数, 左侧值,右侧值
M_SliderValue = GUILayout.HorizontalSlider(M_SliderValue,0,1);
效果:
同样的,还有GUILayout.VerticalSlider Api 作为竖向的拖拽条。
M_SliderValue2 = GUILayout.VerticalSlider(M_SliderValue2, 0, 100,GUILayout.Height(100));
这里因为竖向拖拽条本身显示问题的原因,所以手动设置了一下它的高度。更方便于演示。
拓展:GUILayoutOption类。
这些类是用来控制GUILayout控件大小所用的一种选项。
//控制高度
GUILayout.Height(Value);
//控制宽度
GUILayout.Width(Value);
//最大高度
GUILayout.MaxHeight(Value);
//最大宽度
GUILayout.MaxWidth(Value);
//最小高度
GUILayout.MinHeight(Value);
//最小宽度
GUILayout.MinWidth(Value);
//是否可以垂直拓展
GUILayout.ExpandHeight(bool);
//是否可以横向拓展
GUILayout.ExpandWidth(bool);
使用方法:像这样输入在尾部即可。
GUILayout.VerticalSlider(M_SliderValue2, 0, 100,GUILayout.Height(100),GUILayout.MaxHeight(2000));
7.Area : GUI区域
//用于开辟一个不适用于自动布局的GUIArea -- 内部的UI需要手动设置大小和位置
GUILayout.BeginArea(new Rect(0, 0, 200, 200));
{
GUI.Label(new Rect(100,0,200,20),"10086");
}
GUILayout.EndArea();
效果:
8.Window : 窗口
这个暂时没有深入去讲解,但是这个很像是在窗口内开辟了一个子窗口的感觉。
GUILayout.Window(1,new Rect(20, 20, 500, 500), id => { },"1");
{
GUILayout.TextField("My is Windows");
}
9.Toolbar : 工具栏
//需要一个IntID作为接收, 另一个参数则是一个String数组,用作按钮的名字
m_ToolbarIndex = GUILayout.Toolbar(m_ToolbarIndex, new[] { "1", "2", "3", "4", "5" });
效果:
10.Toggle :打开关闭的开关按钮
代码:
//需要一个bool值进行接收, 第一参数为bool值,第二为名字
m_Toggled = GUILayout.Toggle(m_Toggled,"选中我");
效果:
11.Space/FlexibleSpace :空白区域
代码:Space
m_Toggled = GUILayout.Toggle(m_Toggled,"我在上面");
GUILayout.Space(150);
m_Toggled = GUILayout.Toggle(m_Toggled, "我在下面");
效果:
代码:FLexibleSpace
GUILayout.BeginHorizontal();
{
GUILayout.Label("Button");
//这个是用来放在横排和竖排之中的,添加这个会让Button文字,和ClickMe按钮被挤压到左右两侧。
GUILayout.FlexibleSpace();
if (GUILayout.Button("ClickME"))
{
Debug.Log("Click");
}
}
GUILayout.EndHorizontal();
效果:
没有GUILayout.FlexibleSpace();的效果
12.SelectionGrid :选择网格
代码:
//这个同 Toolbar 很相似,但是多了一个最后的参数用来定义列的数量
m_SelectedGridIndex = GUILayout.SelectionGrid(m_SelectedGridIndex, new[]
{
"1",
"2",
"3",
"4",
"5"
},2);
效果:
二,简易多界面实现方法
说是简易窗体框架,但实际上更像是一个界面制作思路。
代码:
[MenuItem("MyEditor/02/ShowWindow")]
static void Openwindow()
{
//开启一个界面
GetWindow<GUIlayoutsView>().Show();
}
//通过一个枚举值来控制页面的数量
enum PageID
{
Base, Battle, Shop
}
PageID m_CurrentPageID;
private void OnGUI()
{
//这样,通过Toolbar创建并且生成了一个类似选项卡的机制,当选择选项卡的按钮时,就会切换页面上显示的内容
m_CurrentPageID = (PageID)GUILayout.Toolbar((int)m_CurrentPageID, Enum.GetNames(typeof(PageID)));
switch (m_CurrentPageID)
{
case PageID.Base:
Basic();
break;
case PageID.Battle:
Battle();
break;
case PageID.Shop:
Shop();
break;
}
}
void Basic()
{
GUILayout.Label("当前为基本页面");
}
void Battle()
{
GUILayout.Label("当前为战斗界面");
}
void Shop()
{
GUILayout.Label("当前为商店页面");
}
效果:
三,一些影响GUILayout渲染的Api
1,GUI.Enable
代码:GUI.Enable可以控制是否可以进行交互
当将GUI.Enable 设置为False时,可以将之后的全部GUI变为不可交互状态。
代码:
private void OnGUI()
{
//这样,通过Toolbar创建并且生成了一个类似选项卡的机制,当选择选项卡的按钮时,就会切换页面上显示的内容
m_CurrentPageID = (PageID)GUILayout.Toolbar((int)m_CurrentPageID, Enum.GetNames(typeof(PageID)));
GUILayout.Button("ClickMe");
IsEnable();
switch (m_CurrentPageID)
{
case PageID.Base:
Basic();
break;
case PageID.Battle:
Battle();
break;
case PageID.Shop:
Shop();
break;
}
}
void IsEnable()
{
m_EnableInteractive = GUILayout.Toggle(m_EnableInteractive, "是否可以交互");
if (GUI.enabled != m_EnableInteractive)
{
GUI.enabled = m_EnableInteractive;
}
}
效果:当为true时
当为false时
2,GUIUtility.RotateAroundPivot
作用:根据坐标轴来旋转接下来的GUI组件
代码:
private bool m_OpenRotateEffect = false;
/// <summary>
/// 旋转
/// </summary>
void OnRotate()
{
m_OpenRotateEffect = GUILayout.Toggle(m_OpenRotateEffect, "旋转效果");
if (m_OpenRotateEffect)
{
//执行旋转 旋转角度 旋转点
GUIUtility.RotateAroundPivot(45,Vector2.one * 100);
}
}
效果:
3,GUIUtility.ScaleAroundPivot
效果:根据一个点进行缩放
代码:
void OnScale()
{
m_OnScaleEffect = GUILayout.Toggle(m_OnScaleEffect, "缩放效果");
if (m_OnScaleEffect)
{
//这个同旋转的参数很类似,第一个时缩放倍率,第二个是缩放点。
GUIUtility.ScaleAroundPivot(Vector2.one * 0.25f,Vector2.one * 100);
}
}
效果:
4,GUI.color
作用:设置颜色
代码:
void OnSetColor()
{
m_OnColorEffect = GUILayout.Toggle(m_OnColorEffect, "颜色变红");
if (m_OnColorEffect)
{
GUI.color = Color.red;
}
}
效果