UGUI笔记

六大基础组件

Canvas对象上依附的

Canvas:画布组件,主要用于渲染UI

Canvas Scaler:画布分辨率自适应组件,主要用于分辨率自适应

Graphic Raycaster:射线事件交互组件,主要用于控制射线响应相关

RectTransform:UI对象位置锚点控制组件,主要用于控制位置和对其方式

EventSystem对象上依附的

EventSystem、Standalone Input Module:玩家输入事件响应系统和独立输入模块组件,主要用于监听玩家操作

Canvas组件

canvas的作用:
渲染自己所有的UI子对象

如果UI控件对象不是Canvas的子对象,那么控件将不能被渲染
可以通过修改Canvas组件上的参数修改渲染方式

场景上可以有多个Canvas对象
可以分别管理不同画布的渲染方式,分辨率适应方式等参数

三种渲染模式

Screen Space -Overlay:屏幕空间,覆盖模式,UI始终在前

Screen Space -Camera:屏幕空间,摄像机模式,3D物体可以显示在UI之前

World Space:世界空间,3D模式

Screen Space -Overlay

覆盖模式,UI始终显示在场景内容的前方

Pixel Perfect:是否开启无锯齿精确渲染(性能换效果)
SortOrder:排序层编号(用于控制多个Canvas时的渲染先后顺序)
TargetDisplay:目标设备(在哪个显示设备上显示
Additional Shader Channels:其他着色器通道,决定着色器可以读取哪些数据

Screen Space -Camera

摄像机模式,3D物体可以显示在UI之前

RenderCamera:用于渲染Ul的摄像机(如果不设置将类似于覆盖模式)(建议用单独一个摄像机来渲染  )
Plane Distance:U平面在摄像机前方的距离,类似整体Z轴的感觉(不建议用这个来调整3D物体和UI的先后顺序)
Sorting Layer: 所在排序层
Order in Layer:排序层的序号

World Space

3D模式,可以把UI对象像3D物体一样处理,常用于VR或AR

Event Camera:用于处理UI事件的摄像机(不设置的话不能正常注册UI事件)

CanvasScaler组件

CanvasScaler意思是画布缩放控制器,它用于分辨率自适应的组件

它主要负责在不同分辨率下UI控件大小自适应,它并不负责位置,位置由之后的RectTransform组件负责

它主要提供了三种分辨率自适应的模式,我们可以选择符合我们项目需求的方式进行分辨率自适应

必备知识点

屏幕分辨率:
Game窗口中的Stats统计数据窗口看到的当前“屏幕”分辨率会参与分辨率自适应的计算

画布大小和缩放系数:
选中Canvas对象后在RectTransform组件中看到的宽高和缩放
宽高*缩放系数 = 屏幕分辨率

Reference Resolution:
参考分辨率
在缩放模式的宽高模式中出现的参数,参与分辨率自适应的计算

分辨率大小自适应
通过一定的算法以屏幕分辨率和参考分辨率参与计算得出缩放系数
该结果会影响所有UI控件的缩放大小

三种适配模式

Constant Pixel Size(恒定像素模式)无论屏幕大小如何,U始终保持相同像素大小
Scale With Screen Size(缩放模式):根据屏幕尺寸进行缩放,随着屏幕尺寸放大缩小
Constant Physical Size(恒定物理模式):无论屏幕大小和分辨率如何,UI元素始终保持同物理大小

Constant Pixel Size(恒定像素模式)

Scale Factor : UI缩放比例,按此系数缩放UI

Reference Pixels Per U:单位参考像素,多少像素对应Unity中的一个单位(默认一个单位为100像素)

图片设置中的Pixels Per Unit设置,会和该参数一起参与计算

UI原始尺寸=图片大小(像素)/(Pixels Per Unit/Reference Pixels Per Unit)

Pixels Per Unit在图片中修改

Set Native Size就是设置成原始尺寸

这种模式各种UI大小都是固定的(保持原始尺寸)

但是我们可以通过代码得到屏幕分辨率然后修改Scale Factor从而达到放大缩小的效果

Scale With Screen Size(缩放模式)

Reference Resolution:参考分辨率(美术同学出图的标准分辨率)
缩放模式下的所有匹配模式都会基于参考分辨率进行自适应计算


Screen Match Mode

屏幕匹配模式,当前屏幕分辨率宽高比不适应参考分辨率时,用于分辨率大小自适应的匹配模式

Expand

水平或垂直拓展画布区域,会根据宽高比的变化来放大缩小画布,可能有黑边
将Canvas Size进行宽或高扩大,让他高于参考分辨率计算公式
缩放系数 = Mathf.Min(屏幕宽/参考分辨率宽屏幕高/参考分辨率高)
画布尺寸 屏幕尺寸/缩放系数

就是通过扩大画布来显示全部UI

表现效果:最大程度的缩小UI元素,保留UI控件所有细节,可能会留黑边


Shrink

水平或垂直裁剪画布区域,会根据宽高比的变化来放大缩小画布,可能会裁剪

将Canvas Size进行宽或高收缩,让他低于参考分辨率计算公式:
缩放系数 =Mathf.Max(屏幕宽/参考分辨率宽,屏幕高/参考分辨率高)
画布尺寸=屏幕尺寸/缩放系数

就是缩小画布,让长或宽完全显示,另一个维度不完全显示

表现效果:最大程度的放大UI元素,让UI元素能够填满画面,可能会出现裁剪


Match Width Or Height

以宽高或者二者的平均值作为参考来缩放画布区域

Match:确定用于计算的宽高匹配值

表现效果
主要用于只有横屏模式或者竖屏模式的游戏
竖屏游戏:Match=0将画布宽度设置为参考分辨率的宽度并保持比例不变,屏幕越高可能会有黑边
横屏游戏:Match=1将画布高度设置为参考分辨率的高度并保持比例不变,屏幕越长可能会有黑边

Constant Physical Size(恒定物理模式)

DPI:图像每英寸长度内的像素点数

Physical Unit:物理单位,使用的物理单位种类

Fallback Screen DPI:备用DPI,当找不到设备DPI时使用此值

Default Sprite DPI:默认图片DPI

目的是在不同DPI设备上显示相同像素的大小相同

总结:

它不会让UI控件进行分辨率大小自适应、但是会让UI始终保持设置的大小显示
并且会根据设备DPI进行计算,让不同设备上的显示大小更为准确

3D模式

当渲染模式为World Space时,缩放模式会会强制转换成World 3D世界模式

Dynamic Pixels PEr Unit:UI中动态创建的位图(例如文本)中,单位像素数。

可以让动态创建的位图变得更清晰(例如文本中的文字)

Graphic Raycaster组件

图形射线投射器,用于检测UI输入事件的射线发射器,主要负责通过射线检测玩家和UI元素的交互,判断是否点击了UI

参数

Ignore Reversed Graphics:是否忽略反转图形
选中时X轴或Y轴翻转时按钮将不能响应点击
 

Blocking Objects:射线被哪些类型的碰撞器阻挡(在Screen Space -Overlay渲染模式下无效)
为None时可以透过显示在UI之前的带有碰撞体的3D、2D物体点击按钮
还可以选Two D、Three D即不能透过这类物体点击按钮
All就是都不能透过
 

Blocking Mask:射线被哪些层级的碰撞器阻挡(在Screen Space -Overlay渲染模式下无效)
默认是Everything即所有层级都会被阻挡(在Blocking Objects参数的基础上)
如果不选择某些某些层级,就可以透过某些层级的物体点击

EventSystem和Standalone Input Module组件

Event System

事件系统
管理玩家的输入事件并分发给各个UI控件
所有UI事件都通过EventSystem组件中轮询检测并做相应的执行
类似中转站、与许多模块共同协作

若没有,所有点击拖曳行为都不会被响应

提供了调试打印信息帮助我们查看鼠标位置、选中内容等信息

参数

FirstSelected:

首先选择的游戏对象,可以设置游戏一开始的默认选择

Send Naviagation Events:

是否允许导航事件(移动/按下/取消)
可以通过上下左右WASD来移动选择

Drag Threshould:拖曳操作阈值(拖动多少像素算拖拽)

Standalone Input Module

独立输入模块
针对处理鼠标/键盘/控制器/触屏的输入
输入的事件通过EventSystem进行分发
它依赖于EventSystem组件

参数(了解)

RectTransform组件

RectTransform意为矩形变换、它继承于Transform

参数

Pivot:
轴心点,取值范围0-1(左下角为0,0点)
旋转会以该点进行
Anchors(相对父矩形锚点):
Min是矩形锚点范围X和Y的最小值
Max是矩形锚点范围X和Y的最大值
取值范围都是0-1

Pos(X,Y,Z):轴心点相对锚点的位置

若将锚点改成一个矩形范围:
原本的位置信息和长宽:

会变成距离上下左右的距离(可以是负数):

若锚点改成一条线,则对应X/Y仍会出现,表示位置

Blueprint Mode(蓝图模式):启用后,编辑旋转和缩放不会影响矩形,只会影响显示内容

Raw Edit Mode(原始编辑模式),启用后,改变轴心和锚点值不会改变矩形位置(图片实际位置会改变,即改变Pivot位置但PosXY不会改变)

三大基础控件

Image图像控件

Image是图像组件
是UGUI中用于显示精灵图片的关键组件
除了背景图等大图,一般都使用Image来显示UI中的图片元索

图片显示顺序:越下面越后渲染,后渲染的在上面

参数

切片模式:一般在面板背景图使用

平铺模式:重复原图,可以用做面板底纹

填充模式:可以用作进度条/血条

代码控制

Image img = this.GetComponent<Image>();
img.sprite = Resources.Load<Sprite>("小刻");
(transform as RectTransform).sizeDelta = new Vector2(200, 200);

Text文本控件

用于显示文本的组件

参数

类似于html

边缘线:要加上Outline组件

阴影:加上Shadow组件

代码控制

        Text text = this.GetComponent<Text>();
        text.text = "星穹铁道高手";

Rawimage(原始图片)大图控件

原始图像组件
是UGUI中用于显示任何纹理图片的关键组件
它和Image的区别是:一般RawImage用于显示大图(背景图,不需要打入图集的图片,网络下载的图等等)

参数

Texture可以拖入任何形式的图片,不止sprite

代码控制

RawImage raw = this.GetComponent<RawImage>();
raw.texture = Resources.Load<Texture>("阿能");

组合控件

button按钮控件

默认创建的Button由两个对象组成
父对象:Button组件依附的对象,同时挂载了一个Image组件,作为按钮的背景图
子对象:按钮文本(可选)

参数

代码控制

对于拖脚本来说只能拖公共函数

        Button bnt = GetComponent<Button>();
        bnt.interactable = true;
        bnt.transition = Selectable.Transition.None;

        Image img = GetComponent<Image>();

        //监听点击事件的两种方式
        //点击事件需要在按钮内完成一次按下和抬起


        //1.拖脚本


        //2.代码添加
        bnt.onClick.AddListener(ClickBnt2);//传入无参无返回值的委托
        bnt.onClick.AddListener(() =>
        {
            print("lambda");
        });
        bnt.onClick.RemoveListener(ClickBnt2);//无法指定删除lambda表达式,因为没有名字
        bnt.onClick.RemoveAllListeners();

Toggle开关控件

UGUI中用于处理玩家单选框多选框相关交互的组件

默认是多选框,但可以配合ToggleGroup组件制作为单选框

由四个对象组成:
父对象:Toggle组件依附
子对象:背景图(必须)、选中图(必须)、说明文字(可选)

参数

这部分参数与按钮的相同

构造单选框:
创建空物体,添加Toggle Group组件,然后再把若干个toggle放进去(成为其子对象)
再把父对象拖入各个子对象Toggle组件上的Group参数中

但是其实只要使各个对象的Group是同一个对象即可(不一定要父对象,父对象只是为了直观)

代码控制

    void Start()
    {
        Toggle tog = this.GetComponent<Toggle>();
        tog.isOn = true;
        print(tog.isOn);
        ToggleGroup toggleGroup = this.GetComponent<ToggleGroup>();
        toggleGroup.allowSwitchOff = false;
        //得到当前处于选中状态的Toggle
        foreach(Toggle item in toggleGroup.ActiveToggles())
        {
            print(item.name + "" + item.isOn);
        }
        //监听事件两种方式

        //public函数直接拖入

        //代码控制
        tog.onValueChanged.AddListener(ChangeValue2);
        tog.onValueChanged.AddListener((b) =>
        {
            print("状态改变" + b);
        });
    }

    //与按钮不同的是,函数需要传入一个bool参数
    public void ChangeValue(bool isOn)
    {
        print("状态改变"+isOn);
    }
    private void ChangeValue2(bool isOn)
    {
        print("状态改变" + isOn);
    }

InputField文本输入控件

用于处理玩家文本输入相关交互的组件

默认由三个对象组成:
父对象:InputField组件依附对象以及同时在其上挂载了一个Image作为背景图
子对象:文本显示组件(必须)、默认显示文本组件(必须)

参数

和Button相同的参数作用相同

Line Type:

代码控制

类似Toggle
对于事件监听含有改变文本触发和文本结束触发,函数都需要包含一个string参数
监听方式都是public拖入或者直接代码控制

Slider滑动条控件

用于处理滑动条相关交互的组件

默认由四个对象组成
父对象:Slider组件依附的对象
子对象:背景图、进度图、滑动块

参数

与Button相同的参数不再赘述

代码控制

    void Start()
    {
        Slider s = this.GetComponent<Slider>();
        print(s.value);
        //监听事件两种方式
        //函数需要传入一个float参数
        //1.拖脚本

        //2.代码添加
        s.onValueChanged.AddListener ((v) =>
        {
            print("代码添加" + v);
        });
    }
    public void ChangeValue(float value)
    {
        print(value);
    }

ScrollBar滚动条

处理滚动条相关交互的关键组件

默认由两个对象组成
父对象:Scrollbar组件依附对象
子对象:滚动块对象

一般情况下不会单独使用滚动条
都是配合ScrollView滚动视图来使用

参数

相同参数不再赘述

代码控制

    void Start()
    {
        Scrollbar sb = this.GetComponent<Scrollbar>();
        print(sb.value);
        print(sb.size);

        //监听事件两种方式
        //1.拖脚本(public函数)

        //2.代码添加
        sb.onValueChanged.AddListener((v) =>
        {
            print("代码监听" + v);
        });
    }
    public void ChangeValue(float v)
    {
        print(v);
    }

ScrollView滚动视图

创建时是创建ScrollView,实际控制的脚本是Scroll Rect

Scroll Rect 是UGUI中用于处理滚动视图相关交互的组件

默认由四个对象组成
父对象:ScrollRect组件依附的对象 还有一个Image组件作为背景图片
子对象:Viewport控制滚动视图可视范围和内容显示、Scrollbar Horizontal水平滚动条、Scrollbar Vertical 垂直滚动条

参数

代码控制

    void Start()
    {
        ScrollRect sr = GetComponent<ScrollRect>();
        //改变内容的大小 根据该尺寸决定具体可以拖动多少
        // sr.content.sizeDelta = new Vector2(200, 200);
        sr.normalizedPosition = new Vector2 (0, 0.5f);

        //事件监听两种方式
        //1.拖脚本


        //2.代码添加
        sr.onValueChanged.AddListener((v) =>
        {
            print("代码控制" + v);
        });
    }

    public void ChangeValue(Vector2 v)
    {
        print(v);
    }

DropDown下拉列表

处理下拉列表相关交互的组件

默认由四个对象组成
父对象:DropDown组件依附的对象以及一个Image组件作为背景图
子对象:Label为当前选项描述、Arrow右侧小箭头、Template下拉列表选单(本质是ScrollView)

参数

代码控制

    void Start()
    {
        Dropdown dd = GetComponent<Dropdown>();
        print(dd.value);//索引值
        print(dd.options[dd.value].text);
        dd.options.Add(new Dropdown.OptionData("蒂蒂"));
        //事件监听两种方式

        //1.拖脚本

        //2.代码添加

        dd.onValueChanged.AddListener((index) =>
        {
            print("代码添加"+index);
        });
    }

    public void ChangeValue(int index)
    {
        print(index);
    }

图集制作

DrawCall

CPU准备好要渲染的数据交给GPU进行渲染
可以把DrawCall看成GPU进行渲染前的准备工作,会产生额外的开销,如果过多的话CPU会把大量时间花在提交DrawCall上从而会造成卡顿

降低DrawCall数量:

在UI层面上,  小图合成大图->多个小DrawCall变成一次大DrawCall

降低技巧

注意不同图集之间的层级关系

注意Label的层级关系

图集

打图集的目的就是减少DrawCall

创建图集(要先装2D sprite包)

打UI图集不建议勾选:

Allow Rotation 打图集时会自动旋转以节省空间

Tight Packing 非矩形包装,有空就能放图

此时Batches为4

 加了一张图Batches变为5,但若加同一张图则不会变

打包成图集后Batches变成3

此时加上蒂蒂(由于蒂蒂不在图集中故Batches为4)

此时层级如下

但是如果打乱渲染顺序:

此时dc为5,是由于渲染顺序改变(打断了批处理)
如果是顺序摆放均在图集中的图片dc则不会增加

代码加载

        SpriteAtlas sa = Resources.Load<SpriteAtlas>("粥");
        sa.GetSprite("年");

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值