Unity中8位游戏的局限性及其确切的娱乐性

图片

具有简单机制和像素图形的怀旧游戏可以唤起经验丰富的玩家的温暖记忆,同时,年轻观众也可以轻松使用它们。 如今,许多游戏都被称为复古游戏,但要创造出一种怀旧风格,就需要付出很多努力和计划。 这就是为什么我们邀请Mega Cat Studios的人来帮助我们讨论这个话题。 在本文中,我们将介绍创建真实的NES游戏风格图形所需的一切,包括重要的Unity选项,图形结构和调色板。

创作正宗的NES风格的艺术品


首先,我们将介绍为满足经典Nintendo Entertainment System限制的游戏创建图形的基础知识。 这一代游戏机对寻求复制其真实图形的艺术家施加了严格的限制。 这些是对使用的调色板以及屏幕上对象的大小和数量的限制。 此外,重要的是要考虑此控制台的分辨率为256×240像素。

调色板


在创建NES兼容的图形时,美术师必须考虑许多限制。 首先,这些限制中最重要的是如何在图像中使用调色板。 NES的独特之处在于,调色板的所有可能颜色都“连接”到控制台。 NES通过向NES GPU发送一组值来选择要在图像中使用的颜色,然后GPU返回与这些值匹配的颜色。 以下是NES调色板的图像:


这些颜色不能更改,因为它们是控制台本身的一部分。 所有NES游戏都使用这些颜色的组合来构成图像。

子调色板


为了创建用于游戏的组合,将创建子选板,这些子选板将附加到游戏中的精灵或背景图像上。 NES将调色板分为多个子调色板,这些子调色板可分配给精灵和背景。 每个子调色板包含一种用于所有子调色板的通用颜色,以及三种唯一颜色。 它可以加载四个子调色板作为背景,四个子调色板用于精灵。 对于子画面,每个子调色板开头的整体颜色被认为是透明的。


这是游戏中使用的子调色板集的示例。 上部显示背景子选项板,底部显示子画面子选项板。 在此示例中,黑色是所有子调色板中使用的常用颜色。 由于总体颜色在子画面中被认为是透明的,因此在子画面的子面板中需要第二种黑色,该颜色用作可见颜色。

分配子面板


当艺术家继续在游戏中使用调色板时,对调色板使用的限制变得更加严格。 为了解释这一点,您需要更多地讨论复古控制台如何存储和显示图形。 任何复古游戏机的图形都以8×8像素拼贴的形式存储在游戏中。 因此,艺术家可以通过为不同的对象重复使用图块来节省空间。 (例如,可以通过从中创建悬崖或建筑物来重用部分道路)。 颜色信息不要与图形一起存储也很重要。 所有图块均保存在单色调色板中。 因此,当在游戏中显示图块时,您可以为其分配一个子选板,并同时在屏幕上以不同的子选板显示它。 在现代平台上重新创建复古控制台图形时,这一点很重要,因为它会影响我们将调色板分配给图形的方式。

NES将调色板分配给精灵和背景的方式有所不同。 她分配了精灵调色板taylovo。 这意味着,在子画面中的每个8×8磁贴中,可以将四个子画面子调色板之一关联起来。


该忍者角色使用两个子调色板来增加颜色深度。 在右侧,您可以看到它分为8×8的独立磁贴。 在这种划分形式中,值得注意的是,剑和头带中使用的浅绿松石色和暗红色是这些瓷砖所特有的,其余三个瓷砖中则使用了深紫色和黑色轮廓。

背景受到更严格的限制。 背景调色板分配给16×16片段。 整个屏幕的后台子调色板绑定称为属性表(属性表)。 正是由于这些表,大多数复古图像都在积极使用重复的图块片段。 这些段通常由16×16的图块组成,这就是为什么将它们放置在属性表中的原因。 尽管这是由硬件限制引起的,但此类16×16背景图块已成为复古图形的定义特征,现在对于在现代游戏中对其进行重构绝对是必需的。


考虑到这些限制,以下是一个以RPG风格出现的美丽城市的背景示例。 右图显示该图像已很好地划分为16×16像素的块,并为每个块设置了调色板。 为了节省空间,桥上的瓦,草和砖等元素由这些砖块的重复部分组成。 小型建筑物的屋顶瓦片使用相同的瓦片,但是为它们分配了不同的子调色板,从而使其具有独特的外观。

精灵叠加


即使美术师可以为每个8×8子画面拼贴使用不同的子调色板,但他们可能仍需要将子画面赋予更大的色彩深度。 在这种情况下,可以使用精灵叠加。 叠加精灵是将精灵分为两个单独的精灵,并将它们放置在彼此之上。 这使美术师可以规避每8×8格使用一个子调色板的情况。 因此,艺术家实际上可以在一个8×8区域中使用的颜色数量增加一倍。 这种方法的唯一严重缺陷是子画面渲染的局限性。 NES一次只能显示64个8×8子画面图块,并且在一条水平线上只能显示8个子画面图块。 如果达到此限制,则所有其他图块将不会在屏幕上呈现。 这就是为什么在许多带有大量精灵的NES游戏中,它们开始闪烁的原因。 在这种情况下,显示所有子画面的唯一方法是将它们显示在交替的帧中。 叠加子画面层时必须考虑这些限制,因为这不仅使颜色数量增加了一倍,而且使一条水平线上的子画面瓦片数量也增加了一倍。


这是一个运行中的Sprite分层示例。 左侧显示了幽灵海盗精灵的原始三色版本。 艺术家将其分为两部分-身体/帽子和脸/手,然后为它们分配不同的调色板。 右边是两个元素相互叠加的结果。

要绕开属性表的限制,可以使用背景实现子画面图层。 此技巧通常用于静态图像,例如绘图屏幕和人物肖像,从而使它们具有更大的色彩深度。 为了实现这一点,艺术家必须绘制图像的一部分作为背景,然后在其顶部应用精灵以填充其余部分。


在幽灵海盗的肖像中,还使用了精灵的图层,使深度更大。 他的绿色骷髅在屏幕上呈现为精灵,他的衣领和帽子是背景的一部分。 这使美术师可以在16×16段中使用更多的颜色,以完全规避属性表的限制。

图形银行


为了解释NES的另一个重要限制,我们首先需要回到图形存储在图块中这一事实。 图形图块存储在256个图块的页面上,并且这些页面上的图块无法在不同位置加载到VRAM中,因此,很难将不同页面上的图块进行合并和混合。 NES控制台VRAM能够同时显示512个此类图块。 此外,她将平铺一分为二,以用于精灵和背景。 这意味着控制台只能同时显示256个Sprite Tile和256个Background Tile。 如果艺术家想展示各种各样的精灵和背景元素,那么这种限制将极大地阻碍他。


这是加载到VRAM中的游戏背景和精灵图块的图形表示。 控制台将背景和精灵存储在单独的页面上。

为了解决此限制,NES使用了一项功能,该功能允许美术师将每一页分成称为bank的部分页面。 因此,尽管NES无法从图形数据的不同点加载单个图块,但它能够在不同时间加载页面的各个部分。 在大多数游戏中,此类存储区的大小分别为1 KB和2 KB。 1 KB的存储库对应于四分之一页或64个图块,而2 KB的存储库对应于半页或128个图块。 艺术家必须决定是否要为精灵或背景元素保留每种类型的库,因为必须同时使用这两种类型。 这意味着不可能有1 KB的精灵和背景库。 一页应使用1 KB的存储库,而其他2 KB。 通常,大多数游戏使用1 KB的图片块作为背景,使用2 KB的背景作为背景,因为背景磁贴集通常更静态,并且需要更少的可变性和即时替换。


我们在上面看到的罐装图像。 左侧显示使用2 KB存储库的背景,即分成两半,而右侧显示则分为1 KB存储库的精灵。 每个银行都可以随时免费更换。

1K库对于子画面的有用性非常重要。 如果角色的子画面包含大量动画,而这些动画不能显示在一页上,并且同时有必要加载其他子画面,则可以将单个操作下载到1 KB库中,然后根据屏幕上发生的情况将其替换。 它还增加了可以在游戏的一个区域中使用的精灵的可变性。 例如,如果玩家必须在游戏级别遇到六种类型的敌人,但只有该玩家和其他三种类型的Sprite放置在Sprite页面上,则当一种类型的敌人从屏幕上消失时,游戏可以用一种新型的敌人替换其中一个敌人库。

NES控制台处理背景动画的方式是为sprites使用1 KB,为背景使用2 KB的库的几个严重缺陷之一。 要为NES游戏的背景元素设置动画,艺术家必须创建重复的动画背景元素库。 每个新的重复库将包含每个动画元素的下一帧动画。 这些库彼此替换,从而创建动画。 如果艺术家使用半页大小的库作为背景,则存储所有这些重复的库可能会占用大量空间。 克服此限制的一种方法是将整个游戏的所有动画背景元素放在一个库中。 但是随后,艺术家面临另一个限制:他只剩下128个图块用于每个背景的静态元素。 每个艺术家自己决定哪种存储方法最适合他。

层技巧


那个时代的许多游戏都使用技巧来创建效果,例如视差背景滚动,但是它们也对艺术家和设计师构成了挑战。 后来的16位控制台支持多个背景层,但NES没有此功能。 所有背景都是单个平面图像。 为了营造深度感和层次感,使用了各种程序技巧。 例如,要创建视差滚动,开发人员可以设置一个寄存器,该寄存器在屏幕上画出某个水平线(称为扫描线)时报告。

然后他们可以使用该寄存器控制屏幕滚动的速度和方向。 因此,您可以创建背景的水平线,并以不同于背景其余部分的速度滚动。 对于艺术家和设计师来说,诀窍是要记住背景仍然是一个平面图像。 如果将平台或其他任何应位于缓慢移动的背景“前面”的元素放置在此区域中,则其滚动速度也将比图像的其余部分慢。 这意味着设计师必须在场景中布置背景元素,以使效果不失真。


在此示例中,可以使以红色突出显示以模拟深度的区域滚动的速度比背景的其余部分慢。 屏幕顶部的界面虽然也是平面背景图像的一部分,但它不会滚动。

还有另外一招,艺术​​家可以借助它来“移动”背景元素之一。 在NES,开发人员可以使Sprite优先级小于零。 如果这样做,则精灵将显示在背景的所有不透明像素下面。 Sprite优先级也可以随时更改和切换,因此,如有必要,各个元素可以更改Sprite的优先级。

Unity工作流程带来终极的复古感


下载示例项目并开始与我们合作!

宾夕法尼亚州匹兹堡的Mega Cat Studios已将复古游戏的创作转变为一种艺术形式。 实际上,他们的某些游戏甚至可以在卡带上购买并在Sega Genesis等复古游戏机上玩。



小美杜莎和咖啡危机

Unity工作流程中的最新变化将引擎变成了非常适合制作复古游戏的环境。 2D Tilemap得到了增强,现在支持矩形,六角形和等距图块的图块卡! 此外,您可以使用新的Pixel Perfect Camera组件来实现整体的逐像素运动和图形效果。 您甚至可以使用后处理堆栈添加各种精美的屏幕复古效果。 但是,在执行所有这些操作之前,您必须正确导入和配置资产。

精灵资产的准备


为了使资产清晰且像素化,必须首先正确配置它们。 在“项目”窗口中选择要使用的每个资产,然后在检查器中更改以下参数:

  • 将过滤器模式更改为“点”
  • 压缩更改为“无”


其他过滤模式会导致图像略微模糊,这违反了我们努力追求的清晰像素样式。 使用压缩时,图像数据将被压缩,从而导致精度略有下降。 考虑到这一点很重要,因为某些像素可能由于压缩而改变颜色,从而有可能改变整个调色板。

子画面中颜色的大小和数量越小,压缩对其影响越大。 这是比较正常压缩(默认)和缺乏压缩的示例。


普通压缩/无压缩图像-看起来与原始图像完全相同

要考虑的另一个方面是检查器中图像的“最大尺寸”参数。 如果子画面图像在任何轴上都比“最大大小”属性大(默认值为2048),则它将自动调整为最大大小。 这通常会导致质量下降,并且图像开始显得模糊。 由于某些平台不能沿任何轴支持大于2048的纹理,因此最好保持在该范围内。


最大大小为2048 /现在最大大小为4096

上图显示的是来自单轴大小为2208,最大大小为2048的Sprite Sheet(子画面)的Sprite。如您所见,通过将Max Size属性增加到4096,我们能够确保正确的图像大小而不会降低质量。

最后,在准备精灵或精灵图纸时,必须将枢轴单元模式参数设置为“像素”,而不是“规范化”。


因此,将基于像素确定图像的枢轴点,而不是沿着图像的每个轴以从0到1的平滑间隔来确定。 如果子画面的锚点未与像素精确对齐,则我们将使子画面的位置失去像素精度。 可以在Sprite编辑器中设置Sprite的锚点,当选择Sprite资产时,它将在Inspector中打开。


安装Pixel Perfect 2D软件包


准备好资产后,我们可以使相机像素完美。 像素精确的结果将看起来清晰且明显。 像素图稿不准确的迹象会变得模糊(失真)和某些像素的矩形。

可以使用Unity引擎的“包管理器”导入2D Pixel Perfect包。 单击工具栏中的“窗口”菜单,然后选择“程序包管理器”。 在新窗口中,单击“高级”,然后选中“显示预览包”复选框。 从左侧列表中选择2D Pixel Perfect,然后单击窗口右上角的“安装”。


仅此而已。 现在,您就可以开始使用像素精确的相机组件了。

高像素精度


Pixel Perfect Camera组件已添加到Unity引擎的Camera组件并对其进行补充。 要添加它,请转到主相机并向其添加Pixel Perfect Camera组件。 如果菜单中没有Pixel Perfect Camera组件,请按照上述步骤将其导入到项目中。


现在,让我们检查可用的选项。


首先,我建议在“游戏”窗口中打开“在编辑模式下运行”并将纵横比设置为“自由纵横比”,以便您可以自由更改游戏窗口。该组件将在游戏窗口中显示有用的消息,指示在当前分辨率下显示是否像素精确。


现在,您可以浏览每个参数,并查看它们如何影响游戏外观。

  • Assets Pixels Per Unit — , . , , (pixels per unit, PPU), . , 16 16 , PPU 16 — 1. PPU.
  • Reference Resolution — . . -, . , Sega Genesis 320×224. Sega Genesis 320×224. , 16:9 320×180 398×224 ( ).
  • Upscale Render Texture — . , , - . «Upscale Render Texture» .


1. ( ) 2. Upscale Render Texture ( 45 , , ) 3. Upscale Render Texture ( 45 , , , .)

  • Pixel Snapping ( Upscale Render Texture) — (sprite renderer) , PPU. , transform . - , - .
    • 一个例子:


Pixel Snapping . (0, 0), — (1.075, 0). . , . Pixel Snapping . — (0, 0), (1.075, 0). .

  • Crop Frame (X Y) — , , , .
  • 拉伸填充 -如果为“裁剪框”启用x和y,则始终可用。此选项使相机缩放游戏窗口以适合屏幕,同时保持宽高比。由于不仅对参考分辨率的整数倍执行缩放,所以在所有其他情况下,像素精度都会丢失。但是,此参数的优点是,尽管在许多分辨率下像素精度都下降了,但边缘将没有黑条,并且屏幕将完全充满。尽管拉伸填充通常会导致模糊,但不会显示正常警告。


人物和背景,拉伸填充模糊

像素完美相机建议


如果您需要像素精确的显示并与网格对齐,则建议以下操作:

  • , ( 320×180).
  • Upscale Render Texture
    • , , 90, 180 270 , .
    • Upscale Render Texture - ; . , Pixel Perfect Camera Run in Edit Mode , . - , - .
  • Pixel Snapping
    • . , .
  • Crop Frame X / Y, Upscale Render Texture
    • - upscale render texture, X / Y - , .
  • Stretch Fill

我们建议您设置摄像机,使其尽可能优化为16:9的屏幕比例,包括参考分辨率。在撰写本文时,大多数播放器正在以16:9的纵横比和1920×1080的分辨率在显示器上播放。例如,参考分辨率320×180的比率为16:9,因此,分辨率为1920×1080和其他分辨率为320×180的倍数(例如1280×720)时,屏幕边缘将没有黑色边框。

在Unity工具栏中,您可以转到“编辑”>“项目设置”>“播放器”,并限制游戏支持的纵横比。如果您发现某个配置在所需比例中看起来不错,但不能很好地适应各个比例,则可以在此处关闭这些比例。但是,请记住,并非所有用户都拥有与您的限制完全兼容的屏幕,因此不建议这样做。而是使用裁剪,以便此类用户显示黑色边框,并且游戏不会以与他们的屏幕不匹配的分辨率开始。

结论


当您尝试创建一个用于复古控制台的真实项目时,您需要考虑许多现代开发中没有人想到的技术方面。由于渲染图像和使用少量旧机器内存的特殊性,设计人员必须创造性地思考并规避硬件限制。在现代时代,我们需要了解这些限制和技术,以准确地重现该时代游戏的外观和设计。在下一篇文章中,我们将研究16位游戏时代的设计局限性,以及重现“旧电视”真实风格所必需的Unity工作流程。

Source: https://habr.com/ru/post/zh-CN462843/


All Articles