Tilemaps不是我遇到的第一件事,它给我的新游戏带来了很多麻烦。 复古游戏通常需要注意的另一件事实际上是具有固定的低分辨率显示器。 您需要这些像素,您想要以NES或Gameboy分辨率进行渲染,并希望在其他分辨率下播放时保留该宽高比。 特别是,我的目标是DOS人口统计数据,这意味着内部分辨率为320×240。 除了Unity并没有内部分辨率的概念。
在LibGDX中,当我制作C:\ raft时,我使用了Scene2D,将其传递给具有缩放视口的相机,该视口保留了宽高比,并将视口的尺寸设置为固定值。 在渲染纹理时,我还做了一些有趣的技巧,但这只是为了交换调色板着色器和更清洁的缩放比例,因为在我失真像素之前。 Godot的视口开箱即用,具有基本分辨率并为您设置缩放比例的能力!
Unity使事情变得有些艰难,因为它试图使高分辨率游戏更容易些,而高分辨率游戏可以从灵活,可扩展的UI中受益。 但是,带有大量窗口的文本沉重的UI看起来很奇怪,周围都有死角。 如果您以固定分辨率设计资产,则资产也可能可怕地扩展或周围有空白。 您也不能仅仅依靠项目的“播放器”设置中的分辨率/纵横比设置,因为它们在全屏模式下效果不佳,并且在您进入编辑器的“游戏视图”时完全没有影响。测试事物。
我如何在LibGDX中制作渲染纹理的乐趣最终变成了在Unity中获得固定分辨率并保留长宽比的实际要求。 我的场景现在包括2台摄像机和2幅画布。 渲染为320×240纹理的相机1适用于“画布1”,该画布设置为以恒定像素速率缩放,并包含我实际场景的UI。 实际上,渲染到纹理将使相机固定为该尺寸,因此相机也将固定为该尺寸,因此如果我愿意,可以以像素为单位对其进行绘制(确实如此)。 然后,下一步是实际渲染纹理,这就是第二台相机和画布的用途。 第二个画布实际上会缩放到屏幕视口,同时保留宽高比,只在其中绘制渲染纹理的原始图像。 这样可以正确放置纹理并对其加上字母框。 都好!

除非不是。 摆弄画布和缩放比例这一切,我忘记了重要的一环。 原始画布并未随游戏屏幕缩放,但它仍然存在于场景中,我需要它是因为有按钮和其他东西。 我已经习惯了可以缩放视口的功能,也可以缩放其中的输入,因此,当然,由于断开连接,我不得不将其分为两步。 痛苦的是,您不能只是告诉EventSystem缩放其输入或说出它应该专门使用哪台摄像机,否则我可以很容易地告诉它使用渲染到纹理的摄像机,而不是投影到显示器的摄像机。
因此,我做了一些我实际上不想做的事情,最终不得不编写另一个脚本,这次是要覆盖鼠标的输入处理。 值得庆幸的是,Unity的UI代码位于Bitbucket上,因为我想他们知道人们会想要覆盖掉废话,因为它根本无法满足任何人的要求。
我知道纹理将如何缩放,因此我重新创建了这些计算并覆盖了Unity的UI对鼠标输入的处理。 通过将输入缩放到渲染纹理应该位于的位置及其大小,GUI的GraphicsRaycaster实际上可以正确检测到,并且我终于有了可以正常工作的UI,现在可以在任何分辨率下工作。
认真地讲,如果事情没有那么混乱,本来可以避免的。
向Ocias大喊 我 的 Pixel Art Camera ,我将其用于渲染纹理相机/画布。 这使我的固定分辨率视图可以很好地缩放并进行像素对齐。