(转)Unity UI之GUI使用
一:GUI技术介绍
二:常见基础控件使用
三:GUILayout自动布局
四:GUI皮肤
一:GUI技术介绍
GUI技术看似成为古老的技术,但是Unity5.x之后并没有取消这种UI传统的技术。Unity4.6出现的新的UI技术称之为UGUI,我们会在之后的课程进行讲解,他的出现主要是为了重新定义UI的技术规范,统一之前UI插件繁多,混杂,标准不统一的混乱局面,大有一统江湖的目的。但是原生的GUI生命力依然旺盛。在一些早期开发的项目,小型游戏依然有其存在的价值,简单易用是它存在的硬道理。
UI是游戏组成的重要部分,游戏的很多操作直接通过UI控制。无论摄像机拍到的图像怎么变幻,GUI永远显示在屏幕上,不受变形,碰撞,光照等信息影响。
写GUI脚本,必须注意两个重要特征:
(1)GUI脚本控件必须定义在脚本文件的OnGUI事件函数中
(2)GUI每一帧都会调用
void Start () {
}
// Update is called once per frame
void Update () {
print ("update");
}
void OnGUI()
{
print ("OnGUI");
}
二:常见基础控件使用
GUI基本的控件如下图所示:

public class Demo : MonoBehaviour {
private string _StrText="";
private string _StrPW="";
private int _IntSelectIndex=0;
private bool _BoolCheck1=false;
private bool _BoolCheck2=false;
private float value=0;
private int min=0;
private int max=100;
void OnGUI()
{
GUI.Label (new Rect(0,0,100,30),"I am the Label");
_StrText = GUI.TextField (new Rect(0,50,100,30),_StrText);
_StrPW = GUI.TextField (new Rect (0, 100, 100, 30), _StrPW);
GUI.Button (new Rect(0,150,50,30),”Sure");
_IntSelectIndex=GUI.Toolbar(new Rect(0,200,200,30),_IntSelectIndex,new string[]{"Duty","Equip","Peopel"} );
_BoolCheck1 = GUI.Toggle (new Rect(0,260,100,50),_BoolCheck1,"zhuangbei");
_BoolCheck2 = GUI.Toggle (new Rect(0,300,100,50),_BoolCheck2,"renyuan");
value = GUI.HorizontalSlider (new Rect (0, 350, 200, 50), value, max, min);}
}
三:GUILayout自动布局
前面我们进行布局的时候,会发现每次都需要输入new Rect(),里面包含四个坐标。为了解决这个烦人的问题,Unity公司提供了一个相对简单的布局方案。即每个控件的宽带高度按照一些字体的大小进行统一计算。位置采取靠左对齐,一个控件占据一行的原则。
void OnGUI()
{
GUILayout.BeginArea (new Rect (100, 200, 300, 400));
GUILayout.Label ("I am label");
GUILayout.Label ("hello world");
GUILayout.Label ("Hello Mornig");
GUILayout.EndArea ();
}
GUILayout.BeginArea (new Rect (100, 200, 300, 400));
//相当于布局一个盒子,盒子使用Rect进行定义,如果字体太多,超出范围则不显示。
private bool _BoolDisplay=false;
private bool _BoolDisplayWindow=false;
void OnGUI()
{
if (GUILayout.Button ("Show")) {
GUILayout.Label("I can't show in window");
}
if (GUILayout.Button (" xianshi")) {
_BoolDisplay=true;
}
if (_BoolDisplay) {
GUILayout.Label("I can be show");
}
if (GUILayout.Button ("Show Window")) {
_BoolDisplayWindow=true;
}
if (_BoolDisplayWindow) {
GUILayout.Window(0,new Rect(100,100,200,200),AddWindow,"MyWindow");
}
}
void AddWindow(int winId)
{
if (GUILayout.Button ("Exit")) {
_BoolDisplayWindow=false;
}
}
四:GUI皮肤
1:我们使用GUI.DrawTexture()方法进行贴图的绘制输出,另外,我们还可以结合Resource.Load()类静态方法进行动态提取项目视图中存在的贴图资源。
public class Demo4 : MonoBehaviour {
//public Texture2D Txt2D_bird;
private Texture2D _Txt2D_bird;
// Use this for initialization
void Start () {
_Txt2D_bird = (Texture2D)Resources.Load ("A");
}
// Update is called once per frame
void Update () {
}
void OnGUI()
{
GUI.DrawTexture (new Rect(Screen.width/2-_Txt2D_bird.width/2,Screen.height/2-_Txt2D_bird.height/2,_Txt2D_bird.width,
_Txt2D_bird.height),_Txt2D_bird);
}
}
之前我们设计的界面,美观程度太低了,真正的游戏项目不可能接受丑陋的界面的,那么我们该如何去做呢?Unity已经为我们提供好了一个解决方案,答案就是使用GUISkin
(1)首先项目视图中鼠标右键点击Create->GUI SKin,然后选择CustomStyle进行贴图的赋值,需要几个就进行赋值几个即可。
(2)代码中public GUISkin prijectSkin,进行连接即可。
public class Demo5 : MonoBehaviour {
public GUISkin projectSkin;
public Texture2D Text2D_Btn1;
// Use this for initialization
void Start () {}
// Update is called once per frame
void Update () {
}
void OnGUI()
{
GUI.skin = projectSkin;
GUI.Button(new Rect(0,0,100,100),"",projectSkin.GetStyle("Button1"));
}
}
2:滚动视图的使用
滚动视图是一种非常大众化的界面,大部分游戏都存在滚动视图的影子。
//Parameters(参数):
position : Rect —— 滚动视图在屏幕上的矩形位置;
scrollPosition : Vector2 —— 用来显示滚动位置;
viewRect : Rect —— 滚动视图内使用的矩形;
alwayShowHorizontal : boolean —— 可选参数!总是显示水平滚动条,如果设置为false或者不设置时,只用当内矩形区域宽于外矩形区域时才显示;
alwayShowVertical : boolean —— 可选参数!总是显示垂直滚动条,如果设置为false或者不设置时,只用当内矩形区域高于外矩形区域时才显示;
horizontalScrollbar : GUIStyle —— 用于水平滚动条的可选设置,如果不设置,水平滚动条将使用当前的GUISkin;
verticalScrollbar : GUIStyle —— 用于垂直滚动条的可选设置,如果不设置,垂直滚动条将使用当前的GUISkin;
Returns(返回):Vector2 二维向量—— 被修改的滚动位置scrollPosition。返回值应该赋予你的变量;
Description(描述):在GUI中开始一个滚动视图,滚动视图让你在屏幕上产生一个小的区域,使用滚动条可以查看一个大的区域。
private string[] infos= new string [5];
Vector2 scrollPosition;
void OnGUI(){
//开始滚动视图
scrollPosition = GUI.BeginScrollView(
new Rect(10,10,400,400),
scrollPosition,new Rect(10,10,700,700)
,false,false);
//标签内容
GUI.Label(new Rect(10,10,770,40),infos[0]);
GUI.Label(new Rect(10,50,770,40),infos[1]);
GUI.Label(new Rect(10,90,770,40),infos[2]);
GUI.Label(new Rect(10,130,770,60),infos[3]);
GUI.Label(new Rect(10,190,770,40),infos[4]);
//结束滚动视图
GUI.EndScrollView();
}
3:网格布局的使用
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (GUI.Button (new Rect (100 * j, 100 * i,80, 80),"", mySkin.GetStyle ("Coin1"))) {
ButtonClicked (i * 5 + j);
}
}
}
void ButtonClicked(int tag){
print (tag);
}
4:游戏暂停与继续
public class NewBehaviourScript : MonoBehaviour {
public float moveSpeed = 2.0f;
void Update ()
{
transform.Translate (new Vector3(0,0,
moveSpeed* Time.deltaTime));
}
void OnGUI ()
{
if (GUI.Button (new Rect (140, 0, 100, 50), "暂停")) {
Time.timeScale = 0;
}
if (GUI.Button (new Rect (280, 0, 100, 50), "继续")) {
Time.timeScale = 1;
}
}
}
(转)Unity UI之GUI使用的更多相关文章
- 【Unity3D基础教程】给初学者看的Unity教程(六):理解Unity的新GUI系统(UGUI)
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点推荐.谢谢! 理解UGUI的基础架构 UGUI是Unity在4 ...
- Unity 4.6 GUI
一起来窥探Unity的下一代GUI 预览 UI组件 UI结构 Canvas Button Selection List(滑动列表)
- Unity3D_05_理解Unity的新GUI系统(UGUI)
理解Unity的新GUI系统(UGUI) Unity GUI 链接:UnityEngine.UI系统基础类架构图 Unity GUI 链接:UnityEngine Event & Event ...
- unity ui中使用onmouseover
unity ui中鼠标移进或者移出的触发方式与2d.3d的不同,2d.3d物体使用的是onmouseover,ui使用的是OnPointerEnter.需要实现以下两个接口. public class ...
- Unity UI on the HoloLens
Following the steps under "Required configuration" will allow Unity UI to continue to work ...
- 关于 Unity UI 中 GraphicRaycaster.Raycast 数量巨大的问题
有时候会发现 Unity UI 非常耗时,在 Profiler 中可以轻易的看到 UI 中 的 GraphicRaycaster.Raycast 单帧调用可以成百上千,甚至好几千,帧速率前不忍赌,一关 ...
- Unity UI 基础【译】
https://unity3d.com/cn/learn/tutorials/topics/best-practices/fundamentals-unity-ui?playlist=30089 理解 ...
- unity UI如何开启(显示)或者关闭(隐藏)Panel界面最好?
https://segmentfault.com/a/1190000012357091 unity UI如何开启(显示)或者关闭(隐藏)Panel界面,相信大家都是知道的,但是如何做最好呢? 可能大家 ...
- Unity UI性能优化技巧
本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...
随机推荐
- qs.parse()、qs.stringify()使用方法, 以及在axios 中怎么用?
最近一直被纠结于传输格式,就在这里整理一下吧. qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装. (axios 自带qs , // import qs from ' ...
- MySQL中orderby和limit分页数据重复的问题
背景 读取规则是按照某表中sequence字段排序的,而这个字段是让人手工填写的.那么,可想而知,数据一多,难免会出现填写的值相同的情况. 综上所述,可能就会导致以下两条sql出现数据重叠的情况: s ...
- 2019-9-2-win10-uwp-Markdown
title author date CreateTime categories win10 uwp Markdown lindexi 2019-09-02 12:57:38 +0800 2018-2- ...
- shell位置参数变量
- 杭电多校第四场-H- K-th Closest Distance
题目描述 You have an array: a1, a2, , an and you must answer for some queries.For each query, you are g ...
- BZOJ 3546 [ONTAK2010]Life of the Party (二分图最大匹配必须点)
题解:给出一个二分图,问你取点哪个点会使得二分图匹配数减少. 解法:其实就是问二分图匹配的必须点.先对初始二分图做一次最大匹配. 现在考虑左边点,看残余网络上的边重新构图:如果是匹配边那么就从右往左连 ...
- 【Luogu】【关卡2-11】简单数学问题(2017年10月)【还差三道题】
火星人 麦森数 P1403 [AHOI2005]约数研究 f(n)表示n的约数个数,现在给出n,要求求出f(1)到f(n)的总和. 解答:有几个1做约数的个数 = n /1; 有几个2做约数的个数 = ...
- vue 2.1.3 实时显示当前时间,每秒更新
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- python读取ini配置文件的示例代码(仅供参考)
这篇文章主要介绍了python读取ini配置文件过程示范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装 pip install configp ...
- DNS域名服务器的搭建
父域的DNS(svr7): 可以解析父域名下保存的域名地址,即解析.tedu.cn下的域名 一.安装软件包bind.bind-chroot bind是DNS解析服务需要用到的服务软件包,bind- ...