翻译:随梦、
 
怎样让一个像素美术风格的游戏看起来很棒?有很多人问我们这个问题。如果你使用Unity默认设置来开发像素类游戏,那么游戏画面将会很糟糕!不过当前版本的Unity是可以渲染出不错的像素游戏画面的。下文会告诉你一些注意事项。 
 

  左边的图像是由一个校准不正确的相机显示的而右边的图像是校准正确的相机显示的

 

秘密武器
  用这个秘密使你制作的游戏很好看的原因在于渲染一个非常好的像素分界线,换句话说,就是确保让每个像素在一个屏幕上显示出你想要的精灵图片,实现这一效果的技巧是调整正交相机的大小(size)以达到生动的效果
最基本的:什么是正交大小?
  一个正交摄像机上,在世界空间正交的大小决定有多少单位分为屏幕的高度,所以在高度为1080的屏幕上的正交大小就是5,那么每个世界空间的单元就是108(1080/(5*2))像素,5*2的原因是正交大小指定的是屏幕顶部到中心的区域。
因此如果你的精灵图片的像素单位(PPU)是108,那么他就会最好的显示出来。

 

实际实现完美像素的方法
  应用它到实际项目上需要更多的考虑和规划,既然你不能调整目标设备的物理分辨率和你只有很有限范围的PPU(当做资源包转化),仅需要一个数字,可以让你玩弄正交大小。
改变正交大小会影响可见的世界空间,这直接影响你的游戏代码和需求,这里有一个表和不同缩放的场景:
 
垂直分辨率 PPU PPU Scale 正交大小
768 32 1x 12
1080 32 1x 16.875
1080 48 1x 11.25
1080 32 2x 8.4375
1440 32 2x 11.25
1536 32 2x 12

*正交大小=((垂直分辨率)/(PPU Scale * PPU))*0.5

 
  用技术来处理缩放的三个众所周知的技术中你可能会使用全部。

 

技术#1:厚的边界
  对于一些很小的差别,一个“厚边界”就可以很好的解决了,这取决于你的游戏设计,比你参考的屏幕尺寸更大或更小可以很容易的满足厚边界
 

 
  整个屏幕变大,但内容在屏幕的大小不变,通过增加地板或屋顶的厚度可以很容易的解决。
  然而,当屏幕增加超过一定的大小,厚边界就不太好用了。

 

技术#2:增加资源分辨率
  如果你开始参考屏幕高度为768和PPU为32,在1080上将会是因为资源比例不好而很麻烦。上表说明了游戏的缩放比例从768开始到1536的三个备选方案在1080中是如何处理的。更有趣的是正交的大小,理想情况是随着你的屏幕尺寸增加,正交大小是相同的,这将确保你的资源将相同大小的屏幕空间和你的参考像素保持一致。
在上面的表中,使用另一个PPU为48的精灵图片创建一个可见世界空间的参考尺寸小于6.25%,这可能是很简单使用厚边界的处理方法。
 

 
交换精灵图片的资源可以很容易的使用AssetBundle在运行时完成,事例工程。

 

技术#3:平分正交大小
  如果你的屏幕变得足够大,我们可以用图片精灵显示的二倍乘以一个比例因子来计算正交大小,例如1440的情况,我们可以继续用PPU为32的精灵图片,但是计算正交大小为(1440/(2*32))*0.5,11.25来用。
这意味着,每个世界空间单位将包含64个屏幕像素,这实际上是告诉引擎将32像素的的精灵图片渲染64个像素,这里将比例因子设置为2将会较好的显示精灵图片,这只是参考设置小于6.25%。
这个技术不需要创建新的资源

 

 
*PPU为32的精灵现在显示为原来的两倍,看上去还是比较清楚,这只适用于整倍数放大。

 

其他调整
这些其他设置很重要,可以让事情尽可能的变得清晰。

 

精灵:
 
1.确保你的精灵图片使用无损压缩(lossless compression),例如:True Color
2.关掉过滤功能(mipmapping)
3.使用点取样

 

渲染质量设置:
1.关闭各向异性过滤
2.关闭抗锯齿
(可选)通过使用默认的shader创建一个自定义的材质来显示我们的精灵图片,附加到SpriteRenderer上

 

实现细节
实现上述系统需要分两个部分。
1.创建一个简单的组件,根据屏幕的高度来计算相机的正交大小
1).允许重写某些分辨率,以便用户可以决定该分辨率的PPU设置
2).这个计算应该发生在场景一开始的时候
 
2.根据屏幕的高度加载正确的资源包,加载默认的包或者基础的覆盖设置

 

 
已知的问题
即使这些所有的都调整了,还是会有一些问题:
1.物理和动画系统可能在移动或旋转对象位置的时候不理想
2.单像素宽度的资源将呈现不出来任意旋转,解决办法是:
1).避免单像素资源
2)总是确保他们轴对齐

 

结论
制作一个完美像素的2D游戏在Unity的当前版本是可能的,然而,正如上面所说,有一些已知的问题,但他并不是不可逾越的,复古风格的游戏万岁!