IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity编辑器扩展学习(二)—EditorWindow及IMGUI的各个控件的学习 -> 正文阅读

[游戏开发]Unity编辑器扩展学习(二)—EditorWindow及IMGUI的各个控件的学习

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中会出点问题,不会一直调用,仅在游戏脚本中使用才会正常实现怀疑MonoBehaviorEditoriaWindow两个类继承的不是同一个类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,分别是:

  1. GUILayout:自动布局、支持运行时
  2. GUI:需要设置坐标和尺寸、支持运行时
  3. EditorGUILayout 自动布局、仅支持编辑器
  4. EditorGUI 需要设置坐标和尺寸、仅支持编辑器

文档

GUILayout文档地址

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 22:03:23  更:2021-11-14 22:03:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:29:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码