UGUI

UGUI
John Doe1.UGUI概述
GUI,NGUI是过时UI系统,FairyGUI是第三方unity插件,日后可以学习,现在最重要最常用的就是UGUI
2.六大基础组件概述
创建方法:
在Hierarchy窗口右键选择UI选项
所有UI相关内容都在该菜单下
示例:创建Image控件会自动生成Canvas和EventSystem
编辑技巧:
- 场景窗口需切换为2D模式
- 使用矩形工具(Rect Tool)进行UI编辑
- UI内容必须保持在白色边框(摄像机可视范围)内
依附对象:
- Canvas对象上依附4个组件:Canvas、Canvas Scaler、Graphic Raycaster、RectTransform
- EventSystem对象上依附2个组件:EventSystem、Standalone Input Module
自动生成:创建任何UI控件时,这两个核心对象会自动生成
六大组件基本作用:
3.Canvas渲染模式的控制
Canvas组件控制UI渲染,分为三种渲染模式:
(1)覆盖
UI始终显示在场景内容前方
不需要指定摄像机
参数配置:
Pixel Perfect: 抗锯齿开关(性能换效果,一般不开)
Sort Order: 多个Canvas的渲染顺序控制(数字越大越后渲染,显示越靠前)
Target Display: 目标显示设备
Additional Shader Channels: 着色器可读取的数据通道(不用管)
(2)摄像机
- 需要指定渲染摄像机,不然就还是覆盖模式
- 指定特定摄像机后,把此摄像机剔除遮罩(culling mask)只选UI,把摄像机渲染类型改为overlay(没有UI的部分为透明,这时候背景类型就不要管了,自动设置好了),将此UICamera加入主摄影机的栈里(渲染类型为overlay的摄影机无法单独存在),并将主摄影机的剔除遮罩去掉UI
现在的渲染逻辑是:
Unity 先渲染 Main Camera (3D世界) -> 然后保留画面 -> 再把 UICamera (UI元素) 叠加上去。
指定摄像机后3D物体和UI可以互相遮挡,需要这种操作时一般让3D物体成为canvas子物体的子物体(例如image的子物体)
新增参数:
Render Camera: 指定渲染UI的摄像机(需指定新的摄像机)
Plane Distance: UI平面与摄像机的Z轴距离
Sorting Layer:层级排序系统(默认层为Default)
Order in Layer:同层级内的渲染优先级(数值越大显示越靠前)
(3)世界空间
- UI作为3D世界中的对象存在
- 可与其他3D对象产生空间交互
- 常用于游戏内UI、VR/AR界面等场景
额外补充: 场景中可以有多个Canvas对象 — 不同的渲染和分辨率适应方式,但是不常用
4.CanvasScaler必备知识
CanvasScaler是画布缩放控制器,用于UI分辨率自适应
1.学前准备
(1)屏幕分辨率查看
查看位置: Unity编辑器Game窗口的Stats统计数据窗口
特性:
实时显示当前Game窗口尺寸
会随窗口大小调整动态变化
参与分辨率自适应计算
(2)画布大小和缩放系数
计算公式: 画布宽高 × 缩放系数 = 屏幕分辨率
验证方法:
示例计算:800 × 0.97125 ≈ 777(宽度)
519.9485 × 0.97125 ≈ 505(高度)
重要规律: 该关系适用于所有适配模式
(3)参考分辨率
- 出现条件: 仅在”Scale With Screen Size”模式中出现
以下为Gemini对参考分辨率的解释:
一、 参考分辨率是什么意义?
你可以把它理解为**“设计师的画布尺寸”或者“标准尺子”**。
- 它是沟通的基准
当美术给你出 UI 图时,你必须问他:“你是按多大尺寸画的?”
如果美术说:“我是在 PS 里按 1920x1080 画的。”
那么你的参考分辨率就必须设为 1920x1080。
意义在于:
如果不设定这个基准,一个“100像素宽”的按钮,在 4K 屏幕上会像一粒米那么大,而在老式诺基亚屏幕上可能占满全屏。
有了参考分辨率,Unity 就知道:“哦,你在这个分辨率下设计的按钮占屏幕宽度的 10%,那到了其他手机上,我也尽量让它占 10%。” - 它是缩放计算的分母
Unity 计算缩放系数(Scale Factor)的公式其实很简单:
缩放系数=当前手机的实际分辨率/你设置的参考分辨率
举例:
参考分辨率设为 1920 (宽)。
玩家手机是 iPhone 14 Pro Max,宽度比如是 2796。
Unity 就会算出:
2796/1920≈1.45
于是,你游戏中所有的 UI 元素都会被放大 1.45 倍。(是指占用像素量放大1.45倍,但不同设备dpi每英寸像素密度是不一样的)
结果: 虽然手机像素变多了,但按钮在视觉上的占比和你在电脑上看到的一模一样。
2.三种适配方式
常用第二种,第一种和第三种类似
5.CanvasScaler恒定像素模式
核心特性:无论屏幕大小如何,UI始终保持相同像素大小
1.缩放系数
作用:按此系数缩放画布中的所有UI元素
计算公式:宽高×缩放系数=屏幕分辨率
示例:
默认值为1时,UI元素保持原始大小
设置为2时,UI元素扩大两倍
修改后Canvas的宽高变为屏幕分辨率的一半
2.每单位参考系数
- 定义:表示多少个像素对应Unity中的一个单位
- 默认值:100像素对应1个Unity单位
- 关联参数:与图片设置中的Pixels Per Unit参数共同参与计算图片原始大小
- 公式:UI原始尺寸=图片大小(像素)/(Pixels Per Unit/Reference Pixels Per Unit)
Pixels Per Unit是sprite里的每单位像素数
应用:
当两个参数都为100时,结果为1,图片保持原始尺寸
当Reference Pixels Per Unit改为50时,计算值为2,图片尺寸减半
通过Image组件的Set Native Size(设置原生大小)按钮触发计算
要注意:导入的普通图片要在纹理类型选为:sprite(2D和UI),sprite模式要选为:单一,并且保存后才能作为sprite使用
6.CanvasScaler缩放模式(最常用)
三种屏幕匹配模式:
1.expand
一句话:水平或垂直拓展画布区域,会尽力展示所有UI,但可能会出现黑边
具体细节:
2.shrink
一句话:水平或垂直裁剪画布区域,会尽力让画布充满屏幕,但可能会出现裁剪
具体细节:
3.match width or height(最常用)
7.CanvasScaler恒定物理模式
不需要知道太多,作用就是在不同设备ui的物理大小一样,基本用不到
8.CanvasScaler世界模式(3D模式)
只有在Canvas渲染模式改为worldspace才会出现的模式,不常用,只需记住DPPU越大UI文本越清晰
9.GraphicRaycater图形射线投射器组件
canvas渲染模式选为overlay没有后两个选项
1.第一个就是指是否能点击按钮背面(当沿x或y轴旋转后按钮背面展现在摄像机前,此时能否点击,而沿z轴旋转是转圈,正面始终朝向屏幕)
2.第二个和第三个一起作用,就是说哪些层的哪些类型的碰撞器能阻挡你不能点按钮(举例:设置一个带有collider的cube,层级是default,blocking mask选为default,blocking objects选为3D,这时cube放在按钮前的话就不能够点击了)
10.EventSystem和StandaloneInputModule
1.EventSystem组件
2.StandaloneInputModule
基本不需要更改,初始键位已经帮我们设置好了
11.RectTransform矩形变化
1.轴心点
各个UI的中心,绕z轴旋转基于的点,以及宽高修改基于的点
例如轴心在UI最左侧,改变宽度UI只会向右拉伸
2.锚点
注意锚点都是相对于父矩形的,
当锚点是点时:Pos(X,Y,Z)是轴心点相对于锚点的位置,可以实现分辨率改变时UI相对于父矩形位置不变
当锚点是范围时:
Pos(X,Y,Z)会变为左右上下,分别代表UI最左边距离父矩形左边的距离……当想让UI随父矩形大小改变而改变时可以这样做
3.快捷操作
shift和alt也可以同时按
重要补充:RectTransform的位置是anchoredPosition,也就是轴心点相对于父矩形锚点的位置,而localPosition是轴心点相对于父物体轴心点的位置
12.Image图像控件
1.参数详解
unity6版本Raycast Target翻译为了光线投射目标
四种图片类型:
(1)simple:当你的图片不需要拉伸时选这个
(2)sliced:可以在源图像的sprite editor下修改九宫格,这样image拉伸时就只拉伸十字区域,四个角是不变的,能使图片更加自然,适合设置背景时使用
(3)tiled:拉伸图片不会放大,会出现多个图片,同样能用九宫格控制,适合作为背包底图
(4)filled:可以选择多种填充方式,适合作为血条和CD
2.代码控制
常见代码:
13.Text文本控件
1.参数相关
2.富文本
开启富文本可以对文本分别添加不同的效果
(改正:颜色后面不是而是)
3.代码控制
14.RawImage原始图像控件
不常用,与image一大区别是可以用各种类型的源图像,不需要打入图集
15.Button按钮控件
1.参数详解
2.代码控制
3.监听点击事件的两种方式
(1)拖脚本
拖入脚本选择监听的函数功能
(2)写代码
点击按钮相当于委托,用代码可以添加或去除订阅者
16.Toggle开关控件
1.参数详解
部分参数和button一样不再赘述
(1)一般不更改Graphic而是更改子对象Checkmark
(2)单选框操作:
在canvas下新建空物体取名ToggleGroup并添加组件Toggle Group,把互斥的按钮当做其子对象,然后把父对象ToggleGroup拖入每个子对象按钮的group里就行
这只是一种比较直观的方式,当然不创建父对象也行,直接在互斥的其中一个按钮添加toggle group组件,然后把这个对象拖到与其互斥按钮的group里就行,自己的group也要拖
2.代码控制
3.监听开关事件
两种方式都要注意,要选择传入bool类型的函数功能,开和关按钮时都会触发委托,且把按钮状态传入此bool类型
17.InputField文本输入控件
1.参数详解
Content Type:
Line Type:
2.代码控制
3.监听事件
有两种监听事件,一个是改变输入值时,一个是结束输入时(回车或光标点击文本框外)
(1)拖脚本
(2)代码
18.Slider滑动条控件
1.参数详解
2.代码控制
3.监听事件
监听的函数一定要传入一个float值
19.ScrollBar滚动条
一般配合ScrollView一起使用
1.参数详解
2.代码控制
3.监听事件
监听的事件要传入一个float值
20.ScrollView滚动视图
ScrollView的基本组件名叫ScrollRect,所以一般代码控制时类型要写ScrollRect
1.参数详解
(1)具体内容作为Content子物体
(2)改变Content宽高变成了改变其右和高度,右代表其右边距离父矩形右边的距离,向左为正
(3)当不需要一侧的滚动条时,delete控件的同时,要在ScrollRect里把对应滚动条选为null
(4)Auto Hide And Expand Viewport:意思就是当content画幅小于等于viewport时,就把滑动条隐藏了,并且把viewport拓宽到原滑动条外边界
2.代码控制
3.监听
一般不常用,监听函数要传入vector2
21.Dropdown下拉列表
1.参数详解
2.代码控制
3.监听事件
需要传入int类型值
22.DrawCall(性能优化)
1.定义
DrawCall在UI、3D模型、shader等方面都有,这次主要讲UI方面
2.注意事项
要注意不同图的层级关系,假设A,B,C三张图都挂在一个panel下,A和C在同一张图集,B在另一张图集,ABC的层级依次为123,此时的DrawCall为3次,然而将AC层级放在相邻时,属于同一图集所以会批处理一起渲染,DrawCall此时为2
3.用内存换取减少DC
举个例子,当三个面板都需要一张图时,你可以将这张图分别打入三份面板使用的图集,这样会减少DC但会增加内存;又或者将这张图打入通用图集,这样每个面板的DC都会增加一次,但内存会减少
23.图集制作
1.如何打开制作图集功能
一般我们选择最后一个Always Enabled
2.参数
这里先只讲两个参数,允许旋转和紧密包装一般关闭,紧密包装是指有的小图中间是透明部分,这透明部分也可以放其他小图,一般都关闭避免未知报错发生
3.代码控制
24.UI事件监听接口
1.何意味
2.常用事件接口
一定不要忘了在monobehaviour后面加上这些接口名,不加脚本不会报错但实现不了效果
接口名-函数名-功能
不常用的:
3.PointerEventData
实现接口的函数需要传入一个PointerEventData,这是一个独立的类,里面记录着鼠标的各种信息,可以调用它的内置变量,它的父类是BaseEventData
它的常用变量:
4.总结
怎样避免这个麻烦呢,可以在控件脚本内创建新的事件,接口函数内就调用这个新事件,然后panel脚本里订阅这个新事件,这样重要的逻辑操作就还是在panel脚本里完成
25.EventTrigger事件触发器
1.定义
它是一个组件,里面实现了各种接口,要哪个就把哪个加到list里
2.使用方式
(1)拖脚本
在检查器里选择想要控件实现的接口,然后添加函数,要注意函数里要传入BaseEventData变量(PointerEventData的父类)(代码控制里的函数也需要传这个类型变量),如果想在函数里用PointerEventData里面好用的变量,需要写这么一句PointerEventData eventData=data(传入的BaseEventData变量名) as PointerEventData;
(2)代码控制
稍微比较复杂,具体流程如下:
// 1. 创建Entry对象
EventTrigger.Entry entry = new EventTrigger.Entry();
// 2. 设置事件类型
entry.eventID = EventTriggerType.PointerUp;
// 3. 添加监听函数
entry.callback.AddListener((data)=>{
print(“抬起”);
});
// 4. 添加到触发器
et.triggers.Add(entry);
一句话:新建 Entry -> 设类型 -> 加函数 -> 扔进 List
EventTrigger.Entry是EventTrigger里的一个类,eventID是Entry里的一个变量名
设置完成后检查器里可能只有接口类型,没有函数,但其实效果是实现了的
3.优势
接口方式(静态,写死的):
场景:你要做一个按钮,它的功能永远是“发射子弹”。
写法:直接在脚本里写 OnPointerUp。
优点:代码清晰,性能最好。
EventTrigger 代码方式(动态,灵活的):
场景:你写了一个“通用技能槽”脚本。
当玩家把“火球术”放进去时,你需要在代码里动态地告诉这个格子:“按下你的时候,放火球”。
当玩家把“治疗术”放进去时,你需要把之前的事件清空,改成:“按下你的时候,加血”。
优点:动态灵活
26.屏幕坐标转UI相对坐标
1.何意味
就是鼠标的位置在ui中一般是相对于左下角而言的,用了RectTransformUtility中的函数可以将鼠标转化为想控制ui控件的父对象下的相对位置,就是和想控制ui的控件在一个坐标系了,这样更加方便控制这个控件的位置变动(注意这里返回的是localPosition)
2.如何使用
父对象很关键,一定明确想控制控件的父对象是谁,还需要得到渲染UI的摄像机,用eventData.enterEventCamera就能得到
27.Mask遮罩
28.模型和粒子显示在UI之前
1.两种方式
方法二流程:创建一个3D物体,把其图层设为model,创建一个新摄影机只拍它,剔除遮罩也只选model,Render Texture选上这个摄影机。然后在canvas里创建raw image(因为能用各种类型的图片),然后把render texture当做源图像就行了
(这种方法适合只有一个3d模型需要在ui展示)
2.粒子的特殊点
说的可以通过调整z轴来让一部分出现在image前,但我试了不行啊
粒子系统里能改变图层顺序来让粒子完全出现在image前
29.异形按钮
两种方式:
(1)创建image拖入异形源图像,在image下创建子对象button,去掉button的text,将button的颜色改为全透明,在button组件将目标图形改为这个image异形图像,这样点击button的话异形图像就会响应,然后在button下创建多个透明的image子对象,填满异形图片,这样点异形图就会点到透明image或者button本身,都会让button响应
(2)这种方法简单准确,但会增加内存(开启Read/Write Enabled)
30.自动布局组件
1.何意味
2.布局元素的布局属性
ui控件检查器最下方可以选择查看“布局属性”
自动布局组件会根据这些属性来进行布局
一般布局属性不需要改的,如果需要实现特定效果就加LayoutElement组件更改就行
3.各种自动布局组件
(1)水平垂直布局组件
(2)网格布局组件
(3)内容大小适配器
最常用的是在ui父控件上加网格布局组件(Grid Layout Group)和内容大小适配器(Content Size Fitter)一起使用
(4)宽高比适配器















































































