一、常见GUI控件
二、UGUI
1、简介
- Unity图形用户界面 Unity Graphical User InterFace 是Unity4.6以上版本新加入的界面显示系统
- 与OnGUI对比
----全新的布局系统
?????
~~~~~
?????Rect Transform
?????
~~~~~
?????Layout Group ----强大的事件机制
?????
~~~~~
?????鼠标指针类 拖拽类 点选类 输入类 ----最佳的执行效能
?????
~~~~~
?????减少了GPU负担 - 与NGUI对比
----由NGUI创始人参与开发 ----自适应系统更完善 ----更方便的深度处理 ----淡化了Atlas(图集),直接使用Sprite Packer ----UGUI没有Tween组件 ----开发效率暂时低于NGUI
2、控件
1>Canvas画布
2>Rect Transform 矩阵变换
- 简介
派生自Transform,在UGUI控件上替代原有变换组件,标识一个可容纳UI元素的矩阵 - 属性
----Pos :控件轴心点相对于自身锚点的位置 ----Anchor 锚点:UI元素的4各顶点与锚点的间距保持不变,锚点总是相对于父级,不能超越父物体范围;
?????
~~~~~
????? 表示点 -->PosX
?
~
? PosY
?
~
? Width
?
~
? Hight
?????
~~~~~
????? 表示拉伸 --> Left
?
~
? Right
?
~
? Top
?
~
? Bottom ----Pivot 轴心点:移动、旋转与缩放都围绕轴心点发生变化,(0,0)为左下顶点,(1,1)为右上顶点
3>Image 图片
- 属性
----Image Type贴图类型 1、Simple 简单
?????
~~~~~
????? Preserve Aspect 保持贴图原始比例
?????
~~~~~
????? Set Native Size 将贴图设置为原始尺寸 2、Sliced 切割
?????
~~~~~
????? File Center 填充中部区域,如果取消中部区域为透明 3、Tiled 平铺
?????
~~~~~
????? 保持图片原始尺寸,从左下角重复多次填充空白 4、Filed 填充
?????
~~~~~
????? 可以呈现出从空白到完整填充的过程
4>Text 文本标签
- 富文本语法
< b>粗体< /b> < i>斜体< /i> < size=14>字号< /size> < color=red>颜色< /color>
5>Button 按钮
- 属性
----Navigation 导航
?????
~~~~~
????? Horizontal 水平导航
?????
~~~~~
????? Vertical 垂直导航
?????
~~~~~
????? Automatic 自动导航
?????
~~~~~
????? Explicit 显示导航 ----Visualize 可视化–显示导航路径
6>Input Fieid 输入框
- 属性
----Line Type 行类型
?????
~~~~~
????? Single Line 单行
?????
~~~~~
????? Multi Line Submit 多行文本,回车提交
?????
~~~~~
????? Multi Line Newline 多行文本,回车换行 ----Caret Blink Rate 光标闪烁速度 ----Selection Color 选择的字符颜色
7>Silder 滑块
- 属性
---- Fill Rect 填充矩形区域 ---- Handle Rect 手柄矩形区域 ----Direction 手柄方向 ----Min/Max Value 最小/最大值 ----Whole Numbers 整数数值 ----Value 数值
3、事件
1>事件注册
a、通过编辑器绑定方法
b、AddListener
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class EventDemo : MonoBehaviour
{
public void Fun1()
{
print("Fun1:");
}
public void Fun2(string str)
{
print("Fun2:" + str);
}
private void Start()
{
Button btn = this.transform.Find("Button").GetComponent<Button>();
btn.onClick.AddListener(Fun1);
InputField inf = this.transform.Find("InputField").GetComponent<InputField>();
inf.onValueChanged.AddListener(Fun2);
}
}
c、实现接口
1>鼠标指针类
- IPointerEnterHandler:进入
- IPointerExitHandler:离开
- IPointerDownHandler:按下
- IPointerUpHandler:抬起
- PointerClinkHandler:点击(按下、抬起)
2>拖拽类
- IBeginDragHandler:第一帧
- IDragHandler:每一帧
- IEndDragHandler:结束的那一帧
- IDropHandler:拖拽后放开的那一帧
3>点选类
- IUpdateSelectedHandler:点了选中的每一帧
- IselectHandler:点了选中的那一帧
- IDeselectHandler:不选了那一帧
4>输入类(建立在点选之上)
- IScrollHandler:选中UI并滑动滚轮
- IMoveHandler:选中UI后移动(如按上下左右/WASD)
- ISubmitHandler:选中UI后按回车
- ICancelhandler:选中后按ESC
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class DialogDrag : MonoBehaviour, IPointerDownHandler,IDragHandler
{
private Vector3 offset;
private RectTransform parentRTF;
private void Start()
{
parentRTF = this.transform.parent as RectTransform;
}
public void OnDrag(PointerEventData eventData)
{
Vector3 worldPos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.enterEventCamera, out worldPos);
this.transform.position = worldPos + offset;
}
public void OnPointerDown(PointerEventData eventData)
{
Vector3 worldPos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.enterEventCamera,out worldPos);
offset = this.transform.position - worldPos;
}
}
d、自定义框架
4、ITween(动画库)
- 目的:以最小的投入实现最大的产出,轻松实现各种动画,晃动,旋转,移动以及褪色等等。
- 1、物体移动 MoveTo
??????
~~~~~~
?????? 2、颜色渐变 ColorTo
- 3、物体淡入淡出 FadeTo
- 4、摄像机淡入淡出 CameraFadeAdd
?????
~~~~~
????? CameraFadeTo
- 5、注视旋转 LookTo
?????
~~~~~
????? 6、物体旋转 RotateTo
- 7、物体缩放 ScaleTo
- 8、晃动 PunchPosition
???
~~~
??? PunchRotation
???
~~~
??? PunchScale
- 9、振动 ShakePosition
???
~~~
??? ShakeRotation
???
~~~
??? ShakeScale
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItweenDemo : MonoBehaviour
{
public Transform imgTF, btnTF;
public float moveSpeed = 100;
public iTween.EaseType type;
public void Domovement()
{
iTween.MoveTo(imgTF.gameObject, iTween.Hash(
"position", btnTF.position,
"speed", moveSpeed,
"easetype", type
));
}
}
5、自动布局组控件
1>Grid Layout Group
- 网格布局组,将子元素以表格形式自动排列
- 属性
1、Start Corner 开始角度 2、Start Axis 开始轴向 3、Constraint 约束 ---- Flexible 灵活的 ---- Fixed Column Count 固定列数 ---- Fixed Row Count 固定行数
2>Horizontal Layout Group
- 水平布局组,将子元素按照水平方向自动排列
- 属性
1、Padding 填充 ---- Left 左边距
???
~~~
??? Right 右边距 ---- Top 上边距
???
~~~
??? Bottom 下边距 2、Spacing 间隔 3、Child Alignment 元素的对齐方式 4、Child Force Expand 元素展开
3>Vertical Layout Group
- 垂直布局组,将子元素按照垂直方向自动排列
- 属性
1、Padding 填充 ---- Left 左边距
???
~~~
??? Right 右边距 ---- Top 上边距
???
~~~
??? Bottom 下边距 2、Spacing 间隔 3、Child Alignment 元素的对齐方式 4、Child Force Expand 元素展开
三、Draw Calls优化
1、优化原理
- 在界面中默认一张图片一个Draw Calls。
- 在同一张图片多次显示仍然为一个Draw Calls。
2、精灵打包
- 将要显示的图片打包成一个大图,这样每次要显示的时候即使是使用单个图片,但图片其实已经被打包的图片包含在内了,这样的话就只要渲染1个Draw Calls,减少GPU渲染物体次数。
- 打包步骤如下:
1、选择要打包的图片,并将其类型改为Sprite,并添加你定义的标签 2、菜单栏依次点击Edit -->Project Settings,进入后点击Editor项,将Sprite Packer启用即可(推荐在项目中使用Enabled For Builds,在项目结束后检验时采用Always Enabled) 3、运行程序即可开始打包,关闭程序后在菜单栏点击Window–>2D–>Sprite packer,即可看到打包好的图片 4、注意: ----打包时,并不是所有的图片都能合并在一起,如果图片过多,Unity会根据性能需求,将其分为几个包,并且,打包时需要注意图片的格式(RGB、ARGB…),如果格式不同,打包会存在问题。 ----如果一个图片需要在多个界面使用时,建议不要将其打包,因为每次显示时,调用的就不只是小图,而是大图,这样反而会牺牲性能。
3、图集
- 美工制作图片时,尽量将需要在同一界面显示的小图做到一张大图中。
- 在Unity中切割精灵
----选中图集,在Inspector面板中将Sprite Mode 设置为Multiple ----编辑精灵 Sprite Editor - 具体操作步骤如下:
1、选中大图,将其Texture Type改为Sprite,并将其Sprite Mode改为Multiple,然后点击Apply 2、在菜单栏中依次选择Window–>2D–>Sprite Editor 3、划分有多种分为自定划分和手动划分,自动划分时,直接在图片上框选就行,右下角会出现框的宽高,也可对此图片进行命名 4、自动化分可分为3种,点击左上角Slice,选择Type中的Automatic、Grid By Cell Size、Grid By Cell Count; ----Automatic,该模式下,会自动划分图片,即使不规则也没有关系,但是必须保证每张图片之间要存在一定的像素间隙(α通道),否则无法分割。 ----Grid By Cell Count,该模式下,按照你图片的长宽平均划分为几行几列来得到小图 ----Grid By Cell Size,该模式下,根据输入的每个小图的像素来划分 5、以下就是由大图划分出来的结果
|