Pixels Per Unit在图片导入到Unity的时候,将图片格式设置为Sprite的情况下会出现,其意思是精灵中的多少像素对应世界中的一个单位,默认是100
1. 对于在世界坐标中
在世界坐标中,一般对于Sprite的应用是Sprite Renderer组件
使用一张100 * 100分辨率的图片
将相机设置为正交相机,同时将Size设置为0.5,因为orthographicSize表示相机垂直视体大小的一半,设置为0.5,就代表此时相机的垂直视体大小为一个单位
发现此时图片的长度刚好撑满相机的垂直视体长度,应该是因为此时世界中的主体是Sprite Renderer,而其Scale是1,所以刚好对应一个世界单位,此时,orthographicSize= 0.5,正交相机的高度就是一个世界单位
2. 对于UI系统来说,当Canvas是Overlay模式时
当Canvas是Overlay模式时
在Canvas Scaler中,有一个referencePixelsPerUnit属性
其意思为“如果精灵具有此“每单位像素(Pixels Per Unit)”设置,则精灵中的一个像素将覆盖用户界面中的一个单位”。默认是100
对于Image来说,它也有一个Pixels Per Unit属性
其最终计算结果是Sprite的 PPU / Canvas的referencePixelsPerUnit
其中,SetNativeSize方法有用到这个Imgae的Pixels Per Unit属性
这个方法的意思是调整图像大小以使其达到像素完美,这意味着将图像的 RectTransform.sizeDelta 设置为与精灵的尺寸相等。
在这个方法中,通过Sprite的宽高和Image的PPU比值,来得到当前图片的sizeDelta,且将anchorMin和anchorMax聚拢在一点,当锚点聚在一起时,此时的sizeDelta就是图片的大小,而pixelsPerUnit又等于spritePixelsPerUnit / m_CachedReferencePixelsPerUnit,所以此时
图片的尺寸 = Sprite宽高 / (Sprite 的PPU / Canvas的referencePixelsPerUnit)
- 当Sprite的PPU = 100, Canvas的RPPU = 100,Sprite的尺寸是100 * 100时
图片尺寸 = (100,100)/ (100 / 100)= (100,100)
点击SetNativeSize,查看Image的宽高
符合计算结果
- 当Sprite的PPU = 50,Canvas的RPPU = 100,Sprite的尺寸是100 * 100时
点击一下SetNativeSize
此时Imgae的长宽变成了200,即(100,100)/ (50 / 100) = (200, 200),符合计算规则
即当在其他情况不变的情况下,Sprite的PPU越大,在UI中的Image的原始尺寸越小
3.Image的PPU的其他应用
在计算ILayoutElement的preferredWidth和preferredHeight时也有用到
4. 当Canvas为World Space模式时
Camera的Size为0.5
此时Image的宽高需要是1才能让相机视体的高刚好撑满图片
在官方文档中有说明,是Sprite中的每一个像素将覆盖世界中的一个单位,所以此时一个单位像素对应一个世界单位
参考链接帮你理清Unity中的Pixels Per Unit