之前在做项目的过程中一直对PPU这个参数不是很清楚,这周末查了一些资料,总结一下自己的理解。

这个参数在哪里?

在我们第一次给unity导入图片资源的时候,当我们把Texture Type切换为Sprite(2D and UI)之后就可以看到这个参数,这里我截了一张图,第一次导入系统会自动帮我们把这个参数值设置为100。

这个参数啥意思?

Pixels Per Unit 意思是,每个Unity单位显示多少个像素。默认100也就意味着每1个unity单位显示100像素。

这个Sprite(2D and UI)一般用在哪?

常用的地方有两个,一个是世界坐标系中的SpriteRenderer组件,另一个是UI坐标系中的Canvas下的Image组件。这里面有个坑的地方就是,其实在世界坐标系中和在UI系统中,这个参数的实际使用上是有一些不同的,下面我分为两部分,单独讲一下世界坐标系中的用法和在UI系统中的用法。
为了方便我后面都简称这个参数为PPU

世界坐标系中的PPU

理论验证方法1 相机验证

准备工作: 1.一张100X100的图片素材 2.一个正交摄像机
导入图片后,我们先用一个正交相机来验证一下我们之前的理论
这里我创建了一个默认的相机,这个验证中我们主要用到的参数是图中的这个Size属性,我们把鼠标放上去可以看到描述如图
翻译过来就是相机视图的垂直尺寸,那么什么是相机视图的垂直尺寸呢?这里我也截图说明一下。
图中我用红色标记的间距就是相机视图的垂直尺寸,那么为了验证100像素的图片在相机里是不是1个单位,我们先把这个size改成1,然后创建一个spriteRenderer把我们准备好的100X100的图片资源拖入,得到如下GameView
疑? 为啥图片没有恰好等于屏幕的垂直尺寸嘞?查阅资料后我发现,其实正交相机的size要乘以2才是实际的垂直长度,也就是说其实size是代表垂直半径,并不是直径,好的,我们将size再次修改为0.5,得到正确答案
好的,以上就是通过相机的垂直长度单位1,来验证了图片的PPU为100时,是不是代表1个单位。

理论验证方法2 位移验证

我们再来通过实际场景中验证一次,这次我们创建一个默认的透视相机,并Reset一下相机位置,将图片的位置设置为(0,0,10),让她能出现在相机的视野里
这次我们直接创建一个空物体,并将其对准图片的左下角,为了方便,我们切换到2D模式来做这个操作。
接下来我们把X方向增加一个unity单位,也就是-0.5+1变为0.5,来看看效果。
芜湖,至此,我们在世界坐标系中对PPU的验证就结束了,所以在世界坐标系中使用PPU,就是1个单位能放下多少个图片像素,可以自己调整这个值,来控制在世界中图片显示的原始尺寸,如果你不希望通过缩放来调整图片显示的尺寸,就可以用PPU来做。 所以实际上图片的像素除以100,就是实际的unity单位,假设你是500X200的图片,那么导入后,按照默认的100PPU来算,实际在世界坐标系中的unity单位尺寸就是5X2个单位。 图片的unity单位 = 图片像素 / ppu。

UI系统中的PPU

上面我们理清了世界坐标系中PPU的应用,我们接下来讲一下在UI系统中的Image是如何使用这个参数的。 首先我们直接创建一个Image。系统会自动帮我们创建一个Canvas,如图
这里我们会发现,在Canvas Scaler组件中也有一个属性叫做Reference Pixels Per Unit,以下我们简称RPPU,把鼠标放上去后,我们看一下介绍
翻译后的意思是,如果Sprite设置了PPU,Sprite中的一个像素将覆盖UI中的一个单元,这里的sprite是指Image组件中的sourceImage里的那个图片sprite。
我们先设置好图片,看一下在实际的UI画布中,显示的大小
当前我设置的是1920X1080的屏幕尺寸,测试发现图片显示的尺寸就是100X100的尺寸,在画布下的图片又是按照原本图片的尺寸显示了,这跟PPU有什么关系吗? 难道是Canvas里对PPU进行了重新的计算?这里面有啥逻辑?
在查阅资料后,看到了官方对Image的尺寸计算代码如下:
由上面的图可以推出公式: UI大小 = 原图大小(Pixels) / (Pixels Per Unit / Reference Pixels Per Unit)
下面再附上一组原图是100X100的图的测试结果数据,有兴趣的同学可以自己试试
简单点来说就是,在不改变Reference Pixels Per Unit的情况下,导入图片后默认PPU是100的情况下,UI大小是等于原图大小的, 如果你将PPU改的越小,那么UI大小就会成倍变大,比如PPU改为25,那么原图就会在UI中放大4倍,这下,你有没有搞清楚unity中的PPU呢?欢迎同学留言交流~ 写完终于可以继续肝生化危机8啦,大姐姐我来了!
Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐