帮你理清Unity中的Pixels Per Unit

之前在做项目的过程中一直对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啦,大姐姐我来了!
### UnityPixels Per Unit (PPU) 的定义与设置 #### 什么是 Pixels Per Unit? 在 Unity 中,`Pixels Per Unit` 是用于控制精灵(Sprite)图像缩放比例的一个重要参数。它表示每单位长度中有多少像素。例如,默认情况下 `Pixels Per Unit` 被设置为 100,则意味着 Unity 场景中的一个单位等于该 Sprite 图像的 100 像素宽度或高度[^2]。 #### 如何调整 Pixels Per Unit? 可以通过以下方式来修改 `Pixels Per Unit`: 1. **导入纹理时配置** 当将一张图片作为 Sprite 导入到 Unity 项目中时,可以在 Inspector 面板找到 Texture Import Settings 下的相关选项。其中,“Pixels Per Unit”字段允许手动输入数值以改变缩放行为。 2. **动态脚本更改** 如果希望运行期间灵活调整 PPU 值,也可以通过 C# 脚本来实现: ```csharp using UnityEngine; public class ChangePPUScript : MonoBehaviour { void Start() { Sprite sprite = GetComponent<SpriteRenderer>().sprite; float newPPUValue = 50f; // 自定义新的 PPU 数值 var importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(sprite)); if (importer != null && importer is SpriteImportData) { ((SpriteImportData)importer).pixelsPerUnit = newPPUValue; AssetDatabase.ImportAsset(importer.assetPath); } } } ``` 3. **影响效果分析** 更改此属性会影响物体在摄像机视野内的表现尺寸以及与其他对象的比例关系。具体而言,增加 PPU 将缩小视觉呈现范围,反之则放大[^3]。不过需要注意的是,过度拉伸可能导致画质损失从而显得模糊不清。 #### 注意事项 - 不同分辨率资源需合理规划各自的 PPU 参数以免造成不一致感; - 对于 Tilemaps 使用场景特别要注意统一标准避免拼接错位现象发生。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值