UGUI

Unity UGUI系列二 图片 SpriteRenderer和

2021-11-20  本文已影响0人  合肥黑

接上回Unity UGUI系列一 Canvas 和 Canvas Group,有个示例,用的图片是SpriteRenderer,而不是UI Image。本文就来总结一下这两者的区别,在这之前,先来看看图片导入。

参考
unity 纹理属性及UI图片导入设置
Unity 图片导入设置
Unity的UI图片规范

一、图片导入后的Texture Type

https://docs.unity.cn/cn/2019.4/Manual/TextureTypes.html

image.png

图片的导入类型, 不同的类型适用于不同的应用场景, 也会有不同的设置属性.

在Texture Type中,最常用的就是UI中的图片Sprite(2D and UI),还有模型中的Default。

二、TextureType = Default
image.png image.png
1.Texture Shape:
2.sRGB (Color Texture)

启用此属性, 可以指定图片文件存储在伽马 (γ) 空间中. 相对为线性空间. 默认勾选.

3.Alpha Source

定义如何生成图片的 Alpha 通道.

4.Alpha Is Transparency

勾选此选项之后, Unity 会覆写全透明像素的 RGB 值为临近不透明像素 RGB 的值, 通过这种方式使这些像素存储的 RGB 与临近像素一致, 减少 纹理过滤 时产生的瑕疵.
参考聊聊 Unity 的 Alpha Is Transparency 有什么用

5.Remove Matte (PSD)

对使用透明度 (将彩色像素与白色混合) 的 Photoshop 文件启用特殊处理. 仅当 *.psd 文件时有效.

6.Ignore PNG file gamma

启用此属性可以忽略 PNG 文件中的 Gamma 属性.

7.Non Power of 2

如果图片的大小不是 2 的幂, 这将定义在导入时的缩放行为, 共有 4 个选项.

[注意] 可以在 Unity 中使用 NPOT (非 2 的幂) 纹理大小. 但是, NPOT 纹理大小通常会占用更多的内存, 并且 GPU 采样的速度可能会更慢, 因此, 在可能的情况下, 最好使用两种大小的幂 (宽高都是 2 个幂) 来提高性能.

通常仅应将 NPOT 大小用于 GUI

8.Read/Write Enabled

只有启用此属性之后才可以在脚本中使用 Texture2D.SetPixels 以及 Texture2D.GetPixels 还有一些其他的 Texture2D 方法访问 Texture 数据.

在内部, Unity 使用 Texture 数据的副本进行脚本访问, 意味着这个选项会使 Texture 所需的内存量增加一倍. 因此, 此属性默认情况下处于禁用状态, 并且仅在需要脚本访问权限时才应启用它.

9.Virtual Texture Only

图片仅用作虚拟图片. 通常情况下 Unity 会将纹理既作为 Texture2D (可从脚本访问), 又作为可流式纹理, 选中此选项之后, 仅作为可流式纹理使用, 不可以从脚本访问此纹理.

10.Streaming Mip Maps

启用此属性以在此 Texture上 使用 Mip Map Streaming.该设置对于 Unity 用 Mesh Renderer 显示的 3D 环境中的任何 Texture 都有效.漫反射贴图, 法线贴图和光照贴图对 Mip Map Streaming 均有效.

Mip Map Priority 此数值设置 mipmap 的优先级. Unity 在分配内存资源时使用它来确定要优先处理的 mipmap. 值越大优先级越高.

11.Generate Mip Maps

启用此属性可启用 Mip 映射生成. Mip 贴图是 Texture 的较小版本, 勾选此属性之后, 此纹理的内存占用将会增大 33%, 但是此纹理在远近不同距离下的性能消耗也会变低, 因此需要看项目中是否需要使用内存空间来换取更好的性能表现.


image.png
12.Wrap Mode

变换模式. 选择在平铺的时候纹理的行为.

13.Filter Mode

过滤模式, 选择当纹理进行变换拉伸时如何对其进行过滤.

14.Aniso Level

使用 Anisotropic filtering (各向异性过滤) 方式对纹理进行过滤, 当以陡峭角度查看纹理时可提高纹理质量. 适用于地板和地面纹理, 缺点是会带来较高的性能成本. 因此通常情况下会将这个等级设置为 1 或者 0.

15.Max Size

设置导入的纹理的最大尺寸, 单位为像素.因为艺术家们通常更喜欢使用巨大尺寸大小的纹理, 但是在导入到 Unity 的时候可以将纹理缩小到合适的尺寸大小.

16.Resize Algorithm

当纹理尺寸大于指定的最大尺寸时, 用于缩小纹理尺寸的算法.

17.Format

图片格式设置, 除了一些特殊要求, 自动即可

18.Compression

纹理的压缩类型. 根据平台和压缩格式的可用性, 不同的设置可能最终会具有相同的内部格式.例如, 低质量压缩会影响移动平台, 但不会影响台式机平台.

19.Use Crunch Compression

是否使用紧缩压缩来压缩纹理. 如果可用, 推荐使用此压缩.

Crunch 压缩方式是 DXT 或 ETC Texture 压缩之上的有损压缩格式, 展示图像时, Unity 在 CPU 上将纹理 "解压缩" 为 DXT 或 ETC, 然后在运行时将其加载到 GPU.

Crunch 压缩有助于 Texture 使用最小的磁盘空间和下载带宽.

Crunch 算法可能需要花费很长时间对纹理进行压缩, 但是运行时的解压缩速度非常快!

20.Split Alpha Channel

在以下平台上可以对 Texture 进行 Alpha 分割: tvOS, iOS, Lumin, Android.

21.Override ETC2 fallback

允许选择在不支持 ETC2 纹理格式的 Android 设备上将纹理解压缩到的纹理格式.

22.附录
三、TextureType = Sprite (2D and UI)

很多属性在上面已经说过了,现在主要看不一样的部分:


image.png
1.Sprite Mode
2.Pixels Per Unit

单位距离内的像素点,一般默认100是有些大的,可以通过修改该参数来改变在世界内的大小。

3.Mesh Type
image.png
参考Unity Texture Mesh Type 选项
MeshType 只针对于 SpriteRenderer 有效, 如果不使用这个设置哪个选项都无所谓啦
4.Extrude Edges

参考UGUI性能优化——图集(上),不过我没看懂干啥的。
选择此值以基于像素阿尔法值生成网格。Unity生成的网格通常遵循Sprite的形状。

5.Sprite Editor
image.png
如果点击后,出现弹窗需要安装,参考Unity报错之 No Sprite Editor Window registered. Please download 2D Sprite package from Package Manager.,进行如下操作即可:Windows --> Package Manager-->2D Sprite,然后install即可。
6.九宫格

参考UGUI九宫格纹理拉伸的使用

鼠标放在绿色节点上即可编辑九宫格裁剪线
设置好图片后,就可以把sprite赋值给ui,看效果去了,并将图片类型选择为sliced
7.分割图片(Sprite Mode选Multiple)

参考Unity 2DSpriteUnity中制作自定义字体的两种方式

image.png

分割之后Unity只是创建一个文件来记录有哪些图片,哪些坐标,并不是真正分割出一张张小图片在本地保存


可以使用小图片了
四、Image

参考关于Unity中UI中的Image节点以及它的Image组件

image.png
1.Image Type
2.maskable

没搞懂干嘛的

五、SpriteRenderer
image.png
参考
(1-2)Unity3D/2D:Sprite Renderer组件详解
https://docs.unity.cn/cn/2020.3/Manual/class-SpriteRenderer.html

和Image类似的属性不再说了

1.Flip

有X和Y两个勾选项,可以通过勾选 Flip属性 对Sprite沿X和Y 方向 进行翻转,这样的翻转方式只会影响Sprite本身,而不会翻转其碰撞体和其子对象。而通过Transform控件的Rotation属性的X和Y 轴 实现翻转效果的方式,就会同时翻转其碰撞体和其子对象。

2.【Material属性】

默认为Sprites-Default材质,此时在Scene中Sprite不会受到光源系统的影响。可以通过 Material属性 使用其他的材质来达到不同的渲染效果,并能受到光源系统的影响。

3.【Sorting Layer属性】

可以通过 Sorting Layer属性 设置多个分类图层,其中高图层的Sprite会被先渲染,然后低图层的Sprite被后渲染,并能覆盖高图层的Sprite而显示在其上方。

六、Sprite和UI Image的区别

参考
SpriteRenderer(场景_UI)和Image(Canvas_UI)的区别
Unity中Sprite和UI Image的区别
Unity2D:Sprite和Image的区别

如图,将一张图片直接拖到Scene和放到Image上,都可以在场景中看到,那么区别是什么呢


image.png image.png

那么这种不同会造成什么结果呢?在继续之前,我们先回顾一下游戏中每帧的渲染过程。对任何物体的渲染,我们需要先准备好相关数据(顶点、UV、贴图数据和shader参数等等),然后调用GPU的渲染接口进行绘制,这个过程称作Draw Call。GPU接收到DrawCall指令后,通过一系列流程生成最终要显示的内容并进行渲染,其中大致的步骤包括:

通过上面的认知,我们可以推断:

看起来似乎Image比Sprite有更大的好处,然而事实上,由于片段着色器是针对每个像素运算,Sprite通过增加顶点而裁剪掉的部分减少了相当多的运算次数,在绝大多数情况下,反而比Image拥有更好的效率 —— 尤其是场景中有大量的2D精灵时。

总结一下,SpriteRenderer会创建额外的几何体来裁剪掉多余的透明像素区域,从而减少了大量的片段着色器运算,并降低了overdraw;而Image则会创建简单的矩形几何体。随着2D元素数量的增加,这种差别会慢慢明显起来。

可以看出,SpriteRenderer确实是经过优化以显示更多的元素的。所以在2D游戏开发中,游戏场景中的元素,应该尽量使用它去渲染。而Image应该仅用于UI显示(实际上即使不考虑性能原因,由于屏幕分辨率的变化,Image可能会被Canvas改变显示位置和实际大小,如果用于游戏内元素的显示,可能会造成跟预期设计不一致的显示结果,也应该避免使用)。

七、RawImage

参考
Unity3d随笔之Rawimage和Image
UGUI系列——RawImage应用

image.png
表面上看这两个其实也并没有什么不同嘛,资源都是一张图片,资源也都可以正常显示,那么这两者究竟有何不同呢?

首先两者在实现方式上有差异,Image的代码实现更为复杂,功能也更为丰富,在image组件里,我们可以实现资源的不同的Image Type,有四种,Simple,Sliced,Tiled和Filled。这四种Image Type有各自的应用场景,这个如果有一定的项目经验就会有所了解。

这里我们也是简单说一下吧,Simple顾名思义,简单,也就是不做处理,也是我们默认的一种Type。Sliced,切割,这个是我们在项目中经常会用到的一种Type,它在图片资源的九宫拉伸时会起到很好的效果。Tiled,平铺,这个也是需要进行九宫拉伸才会体现它的效果,Filled,填充,这个的应用场景大多是用于倒计时或者进度条的增长。具体的这四种Type的详细介绍,参考U3d随笔之ImageType

以上说的这些,在Rawimage组件里是没有的,所以大家在上面的我们不是很详细的描述里,应该可以总结出两者在应用场景上的一个差别,前者,也就是Image,大多应用于某个ui的图片显示或者说是一些小图,比如我们刚说的需要拉九宫的图以及用作进度条和倒计时的图,而后者,只有一个Texture和通过UV Rect控制显示,这里的UV Rect就是通过简单的裁剪UV让图片显示部分,所以适合大背景的图进行使用,当然这里我们也有必要说明,被设置为Sprite的资源也可以被赋值给Rawimage,但是Rawimage本质上取得就是这个资源的Texture,其他的属性它都不关心,所以我们在平常进行使用的时候,尽量不要混用,Sprite和Texture尽量还是要分开。

1.UV Rect

x,y,w,h的值的取值范围是0到1的,也就是他们代表的实际是百分比

先将W,H设置为1,然后拖动X,Y观察结果:
XY控制偏移(正数向左向下,负数向右向上)

WH控制缩放

2.小地图

利用Camera的属性 Target Texture,可以指定一个图片给摄像机,这个摄像机什么都不看,只看这个地图。


创建一个New Render Texture

创建另外一个Camera并创建一个Cube,将Camera对准Cube进行观察,并设置Target Texture


image.png
现在将这个render Texture指给Canvas上的Raw Image,就是小地图了:
image.png
上一篇下一篇

猜你喜欢

热点阅读