制作游戏并不困难。 回顾Unity3D上的小型移动项目

当您有一个新的游戏机制的想法,或者甚至是一个有趣的概念的想法时,很快您就会被沉迷于此的巨大冲动开始做某事。 有时,您将这样的想法写下来,并在以后带动它们激发整个开发周期的机会。 但是我偶然发现了相反的动作。 我现在的游戏变成了这个吃财政和时间的庞然大物,并且比我想象的要大得多。 因此,我需要将其放回一会儿。 但是我不能没有游戏开发而坐下来,在空闲时间,我已经开始从事我的新项目! 另外,该版本与以前的版本完全不同,因为我已决定将目标锁定在移动设备上。 如果您对这个项目的完成方式(从一个小想法到最终版本)感兴趣,那么让我们开始吧!



显然,我在说我的经历和远见,但是对于任何项目,很多事情都是很常见的,也许您会为自己找到一些有用的技巧。

在创意基础上雕刻


主要思想很简单-让我们做一个迷宫,一个迷宫! 尽管您可以在商店中找到这类游戏中的一些简单游戏,但我相信您不应该只关注游戏流派,而应该在游戏中带来更多东西。 总的来说,我对游戏设计深感忧虑,喜欢故事和完整的冒险经历,而且起点和终点都很明显。 我不能在这里将我的理想作为例外。 另外,我想要一些有趣的游戏机制。 我的方法是在整个迷宫概念中增加另一个变量。 经过一番集思广益,新想法诞生了。 那就是链条和链开关的系统。 因此,主要角色的移动受到链长和玩家选择的路径的限制。 考虑到这一点,您不仅需要找到出口,而且还需要找到最短的方法! 而且,如果我告诉您您的链条很短,并且只有在提供新锚点和不同长度的新链条的链开关之后,您才能走得更远。 现在,游戏开始变得更加困难,因为您需要在迷宫中找到这些开关的正确顺序。 而且,如果这还不足以满足您的需要-那么让我们添加一扇门,您需要在迷宫内部的某个地方用特殊的激活器打开,然后再回头思考开关和链条。



了解极限


当然,要计划所有这些功能并不容易。 其中一些是由于技术限制和严格的时间管理而制作的。 目的是尽可能快地完成它,而不是在开发过程中显着增加所有游戏方面的复杂性。 链条是用关节制成的,经过一段时间后,游戏引擎物理学无法对其进行处理,实际上会破裂成碎片。 因此,我需要限制其长度,并且仍然能够继续前进。 确实,有一种解决方案可以编写完全自定义的链式脚本,使真实的物理效果变得模糊,但这是我无法负担的耗时的任务。
尽管如此,我还是设法保持了一定的距离,最初的想法是制造一个迷宫式小室,在那里您需要找到最短的方法,但这还不够。 如果整个游戏都是这样,那将是非常乏味的,因为您只需完成一项重复的任务,而无需更改体验或难度。 尽管如此,这些想法仍在最后的比赛中发挥了作用。

灵感与想法:原型制作经验


经过一些原型制作后,很显然迷宫是最有趣的地方,在迷宫中,您必须走出最短的路线,甚至需要回溯。 因此,最终的决定是一个接一个地添加单独的游戏区-具有多个开关的大迷宫,以及以尽可能短的方式构成的小迷宫。 它们全都与一些空旷的走廊相连,使玩家的精力从不断挑战中解脱出来。 但是在测试时,又出现了另一个提供新批判性想法的想法-我们需要更多的游戏机制。 因为即使在迷宫般弯曲的情况下,一个又一个地位于这些迷宫的墙壁上,仍然不足以吸引玩家的注意力。

为了增加注意力范围,请不要忘记该游戏是针对移动平台的。 切勿将其设计为长时间进行游戏而不会中断。 我已经决定在每个链开关上进行节省,因此玩家可以随时离开,并且永远都不会离开上一个游戏时段。 当然,我对如何玩游戏有一些意图,但是我最大预期的不间断会话时间约为5分钟。 这仅包括呈现音乐的场​​景。

回到力学方面,我添加了涉及链条的难题作为解决它们的工具。 这是一个很棒的游戏设计解决方案-重用您已经熟悉的世界对象作为新用途工具。



对于这个新工具,存在着许多不同难题的各种想法,但最终决定是仅实现一种难度有所不同的类型。 如果您认为您的游戏需要所有新的想法及其变体,但又没有时间实施它们,那就停下来! 您的目标是完成游戏。 在这种情况下,您将不会立即实现这些功能,甚至直到开发周期结束时才实现这些功能-一种解决方案是稍后更新游戏,而第二种或更彻底的解决方案是稍后在缺少所有功能的情况下制作全新的游戏功能。 如果您掌握了核心产品,那么继续进行会更容易。 只是不要让这些功能停止发布。 仅当它们是为产品添加独特体验的完整产品的关键部分,并且您无法想象没有这些功能的游戏时,才可以这样做。

浏览技术知识:世界是如何构建的


链条由可配置的关节制成,并在所有轴上锁定运动。 然后实例化为链段,在一个段中通过4个关节将4个刚体连接在一起。 链源类似于井。 为了正常运行,我只是移除了在表面下移动的线段,并在该段的最后一个关节靠近表面时实例化了新的线段。 此外,最后一个关节的刚体被限制为只能作为锚点站立才能进行垂直运动。 此外,绳索具有特殊的防撞材料,且摩擦不大。



播放器是用刚体制成的,刚体可以按照目标脚本移动。 目标上有导航代理。 因此,当我们移动操纵杆时,我们只能通过导航系统移动目标,而玩家的刚体试图通过物理力来达到目标​​。 如果我们只有导航系统,那么链条就无法停止它,玩家就可以充当具有绝对位置控制的运动刚体。 施加力的唯一问题是,随着链段数量的变化,我们在玩家身上的附着质量也有所变化。 然后,如果您必须在链的末端限制很大的重量,它将爆炸。 否则,玩家将被链条向后拖动或完全不移动。 所以我改变了相对于实际链长的质量。 但是,针对链爆炸的最有趣的解决方案-破坏其物理稳定性,是通过自定义脚本来限制其奇异部分的最大速度。

迷宫本身是由较小的迷宫,拼图和连接它们的走廊组成的。 当我刚开始设计那些迷宫时-我只是拿笔和方格纸,开始逐壁画出它们。 但是由于真正的原型以及它如何受到链条的影响而进行了无数次更改之后,我确信这是最无效的处理方式。 因此,我为迷宫创建了一个自定义编辑器窗口。 就像笔和纸一样,但是保存状态可以从墙壁,地板和链式来源的预制件中产生完整的迷宫。 我还增加了对链源长度的控制,这是设计迷宫问题的完整解决方案。



只需记住,对于编辑器时间实例化,您应该使用Prefab Utility方法,而不要使用通用实例化方法,因为否则,您将获得与原始预制件分离的预制件对象的克隆。

后处理


这是个人喜好,但我喜欢后期处理,没有它我无法想象我的游戏。 Bloom是必不可少的选择,但是我也喜欢景深和简单的FXAA解决方案。 使用新的后处理堆栈,正确实施它的步骤非常简单。 我还在播放器上方添加了触发球体,该球体具有另一个带有“ 色差”效果的轮廓,该轮廓在切换时移到了播放器上。 另外,电影结尾的单独配置文件。 但是,在其中一项更新之后, 一切都停止了工作 ,并且在对该设备进行了测试之后,我偶然发现了另一个问题 。 有了一点RenderDoc ,原因就很清楚并且可以立即解决,但是我希望我们能看到Unity团队的正式修复。

优化之路的开始


当游戏即将准备就绪,并且设备上的初始播放已经完成时,我试图在开发能力不强的设备上启动游戏。 那太可悲了。 我之前注意到设备上有一些小凹痕,但是在解决过热问题的最初步骤之后,我认为我再也不会看到如此戏剧性的断断续续了。

对于过热-步骤很简单,我不需要60fps,因此将其锁定为30。加上自定义分辨率缩放器,将短屏幕尺寸限制为720p。 在Time Manager上更改时间步长的另一个技巧对我不起作用,因为它过于依赖大量的物理计算。 当我尝试增加时间步长时,连锁店经常爆炸达到其极限。

所有这些工作都是在弱设备测试之前完成的。 因此,我开始更加仔细地分析探查器。

有趣的一点是,我一直有太多的音频源被启用。 但是我从来不需要同时使用它们,演奏它们的事件是确定性的。 我最终默认情况下几乎禁用了所有信号源,仅针对需要的声音激活启用它们,然后在声音结束后立即禁用它们。

一些脚本受益于手动更新,而不是专有更新,尤其是当我有很多具有相同脚本和其中一个Update方法的类似对象时。 只需将Update方法重命名为ManualUpdate并从外部调用即可。 以我为例,我所有的难题都在现场,他们称之为更新方法,每个难题中的每个支柱都有自己的更新方法,甚至支柱的触发器也都有自己的更新方法。 如果没有这些多个自动更新,并且没有从一个地方手动对每个对象调用更新方法,那么我已经设法显着减少了Unity内部方法调用的开销。

优化中最后但最重要的事情之一就是渲染部分。 如果您想使用标准着色器来交付您的手机游戏,那么您疯了! 也许在少数情况下,材料数量少且着色器变体复杂度较小,因为标准着色器包含大量着色器,因此您可以仅针对顶级设备来实现它。 但就我而言,我最终基于移动表面变体将几乎所有着色器更改为使用自定义着色器。 但是我还没有找到一种使用自定义照明模型模拟金属/平滑度的好方法,因此只有闪亮的金属材料才能使用标准着色器。 但是,如果您看到的是编译版本,那么当您在标准着色器中执行190多次操作而在自定义着色器中执行少于70项操作时,便不需选择正确的版本。 请记住, PBR方法(包括默认的标准着色器)确实占用大量GPU,并且对于移动设备而言过于复杂。 从开发开始就应该使用专门针对移动设备优化的着色器。 自己制作,或使用Unity内置的软件。

下一站:帧调试器


下一个性能提示是检查帧调试器是否存在异常的批处理中断。 或者只是为了查看渲染整个场景需要多少次调用。

当调试器显示尽管材质相同,但某些顺序渲染的对象却破坏了批处理时,我的行为很奇怪。 甚至消息也不清楚,因为它说我为它们使用不同的光源。 但是整个场景只使用了一个定向光源! 这些对象具有相同的材质,并且它们的所有属性都相同! 但是并不是全部,因为我只关注材质和渲染属性。 真正的原因是我将光源更改为按层自定义剔除。 中断序列对象位于未点亮的特定图层中。

无论如何,有时帧调试器会显示奇怪的渲染顺序,破坏批处理。 这些情况中有些是荒谬的,手动进行材质渲染队列校正有助于解决该问题。

此外,帧调试器还显示,尽管几乎所有呈现的对象都是静态的,但我仍有很多批次没有任何意义。 正因为我有很多这样的东西,所以批处理程序制作了许多静态批处理网格物体,并且从未尝试按位置对它们进行分组。 在那种情况下,我的迷宫墙在一个屏幕上,由5个或6个不同的批次组成。 但是那些用相同的材​​料制成! 我最后只添加了地板对象作为静态对象,因为它们全部都在一个批处理的网格内。 其余的墙壁则没有问题地动态地进行批处理,其物料队列已校正为唯一的。 动态批处理对CPU造成了一定的影响,但是在我的情况下,与通过StaticBatchingUtility进行的自定义静态批处理相比,即使是在较弱的设备上,其差异也很小。 动态批处理对我而言,在保存调用时比在边缘情况下自定义静态调用更有效。

框架调试器指出的其他内容是阴影和级联。 如果您感到好奇,那么每个阴影级联几乎都是整个屏幕的另一个阴影通道。 因此,如果您在shadowpass中有多个批次,则将该数字乘以您已获得的级联数。 在发现之后,我刚刚禁用了级联。 但是我仍然需要像样的实时阴影,最后调整摄像机的剪切距离,并以中等质量切换到紧密配合的阴影。 我知道它们不是最漂亮的,但比分辨率低或根本没有阴影的稳定镜头要好得多。

最后一个内部框架调试器和性能是后期处理。 即使只启用了几个效果,这些效果几乎也是最重的-Bloom和景深。 他们俩都使用低分辨率对帧进行采样,但是具有不同的输入纹理和不同的滤镜着色器。 我已经将Bloom更改为在着色器中使用快速模式-正方形滤镜,而不是更复杂的圆形。 可悲的是,这还不够。 因此,我最终更改了效果的初始帧缓冲区内的分辨率比例因子。 默认情况下,它使用的是Half-Res,但是当我使用的不是一半的分辨率而只是三分之一的分辨率时,我已经看到了很大的改进。 将其缩小到四分之一几乎不会影响进一步降低视觉效果。 因此,我在移动设备上进行后期处理的解决方案是三分之一! 或使用完全定制的解决方案。

快到了:波兰语!


自然,每个项目都是独特的,您应该特别考虑您的项目,但是在这里,我只是想展示我决定在抛光过程中放入哪些部分以及原因。
抛光的第一步是在第一个alpha测试之后和性能优化之前进行的。 在最初的反馈中,我添加了几乎已经存在的次要功能,但是还没有脱颖而出。

第一个是彩色地板,从开发伊始我就拥有愿景,但是在实际过程中,我能想到的所有货盘看起来都不自然。 因此,在第一轮中,我仅以整个游戏过程中从亮到暗的颜色渐变结束。 但是测试表明这还不够。 经过所有颜色组合的艰苦努力,找到了合适的颜色。 即使是很小的视觉细节也对整体游戏感产生了显着影响。 通过区分各个阶段,您将获得更大的成就感和进步感。

另一个想法是渴望让玩家拥有更多的乐趣和动态感。 尽管我一开始并不喜欢它,但是我设法找到了一个小妥协,虽然感觉不错,但并没有改变角色的沉稳感。 那就是将水晶锁在玩家内,使其永远不会相对于世界旋转。 但是对于那些感觉就像内在的水晶在每一步都开启的玩家。 实际上,当我还是个孩子的时候,我有一个球,里面有另一个球。 内部漂浮在少量液体中,这并不明显,当您将其滚动在表面上时,看起来好像在盘旋而没有任何滚动。 此功能使我想起了这种独特的感觉。

在所有性能更改之后,即使在该低性能设备上,游戏也开始按预期工作。 不是最低的,但这对我来说还可以。 然后,我有一些时间来考虑其他功能,这些功能会影响整体游戏的感觉,并且对我的愿景至关重要。

第一个是将划痕留在地板上,很快就被用作贴花池。 即使您可能从未见过,但它肯定会增加迷宫般的气氛。

影响我眼睛整体感觉的第二个特征是走廊上的一些石头,这些石头应该为空旷的寒冷世界增添更多活力。 那只是愿景,在最终游戏中也没有任何麻烦。 每当您看到那些小石头掉入黑暗中时,都会给人一种奇特的满足感。

发布点


在完成所有测试之后,您对抛光剂感到满意之后,就可以开始发布了!
对我而言,从一开始的主要目标就是在没有干扰的情况下提供单人游戏体验。 因此,决定很明确:没有广告,没有游戏内购买,没有战利品箱。 对于这些功能,您应该从一开始就设计游戏,并在很大程度上依赖它们作为体验的重要组成部分。 以我为例,我知道对于一个普通玩家来说,整个游戏将需要三到四个小时的经验。 因此,我设定了合理的固定价格并放开了。 自发布以来没有足够的时间考虑任何实质性的销售,也没有任何促销。 但是作为一名开发人员,我对这款游戏非常满意,如果有人喜欢它,那对我来说就是成功。

聚苯乙烯


最后,还有一些功能。 尤其仍然需要完成游戏的气氛,但这并不能从根本上改变游戏体验,因此可以作为发行后的更新来完成。 其余功能永远不会消失。 对我来说可悲的是,在测试最终版本时,我有了一个令人兴奋的想法。 我认为发生这种情况是因为开发工作有一个星期的暂停,并且在返回后我有了新的外观。 也许有一天会有第二场比赛,但是现在所有的想法都将等待他们的时间重新回到新的开发周期。

PPS
请,如果您发现一些错字或语法错误,请发送个人消息给我以纠正它们。

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


All Articles