创作35MM游戏。 俄罗斯的世界末日



大家好,我叫Sergey Noskov。 今天,我想谈谈我的第一个成熟的独立项目35MM的创建,该项目于2016年在Steam上发布。 这个故事当然很长,自那时以来,已经发表了有关该项目主题的几篇文章和访谈,但是,没有详细描述开发过程。 此外,几乎没有触及实施的技术方面。 实际上,我们将讨论这一点。

让我们从一些背景开始。 35MM是在俄罗斯发生后启示录时以第一人称视角进行的冒险。 人民-步行模拟器。 游戏向我们讲述了两个流浪者穿越文明遗留下来的荒芜土地的故事。 大部分人口在一场可怕的疾病之后丧生,如今大自然从人类手中夺回了自己的生命。 不幸的是,我不记得这个项目的想法是如何诞生的,但是我绝对记得那个时候我是狂热爱好者,对缠扰者,地铁游戏以及通常这样的大气环境感兴趣。 废弃的城市,工业区和乡村的风景总是引起我的恐惧和喜悦。 我不知道这是什么病,如何解释这种爱,但我们当中有很多人。 总的来说,对这个主题的热情足以开始创建您自己的小型游戏世界。




由于我已经有两个小项目(Light和Train),以及在Unity引擎方面的经验,因此我开始在其中开发新游戏。 如果我没记错的话,当时该引擎的第五个版本已经可用,但是在某种程度上我是一个保守主义者(不是我的最佳专业特质),所以我决定使用4.7版。 从总体上看,引擎的版本4和版本5之间有很多显着差异,尤其是在渲染,照明和材质方面。 Unity 5引入了物理上精确的着色器,可以正确反射光线并显示反射。 简而言之-带有此类着色器的眩光和材料上的反射看起来更加自然和有吸引力。 在版本4中,基本着色器要简单得多,但是,编写自己的着色器可以显着提高图片质量。 我们稍后再讨论。 显然,除了在引擎本身中工作之外,游戏的开发还包括许多方面。 为了使引擎能够塞满东西,需要内容:模型,纹理,声音,脚本等。 最后,我们在监视器上看到的所有内容都在列中听到。 当然,每种类型的内容都需要自己的软件。 为了创建3D模型,我使用了3D max来处理2D图形并创建纹理-Photoshop来处理声音-Adobe Audition,我在Unity附带的Monodevelop程序中编写了代码。 我特别建议您闭上眼睛或跳到下一章-游戏是用Java脚本编写的。 只是嘘,不要告诉任何人。 我只知道对于某些人来说这是不好的味道,而且没有人写Javascript。 通常,选择了主要工具,并且工作流程正在慢慢移开。


一切如何开始


在一些采访中,我已经提到过,通常我没有一个清晰的发展计划,而只有全局。 因此,位置的创建通常是自发进行的,并且在旅途中会考虑设计。 当然,这不是减号而是加号,但是有一个积极的一面-它非常有趣,您永远不知道接下来会发生什么。 事实证明,游戏在某种程度上已经在初始阶段过着自己的生活。 35MM的开发始于创建第一个位置-废弃的森林房屋和带有田野和针叶林的宽敞地块。



要建造地球表面,请使用具有5-6种草木纹理的地层。 标准的Terrane着色器使用RGBA蒙版在表面上绘制了不同的纹理,该RGBA蒙版是使用引擎本身中的画笔创建的,结果通常看起来非常模糊,纹理之间的过渡太平滑且看起来不自然。 为了完善这一点,更改了Terrane着色器并添加了偏移蒙版。 黑白纹理“移动”了在地形中绘制的蒙版,并创建了撕裂和更锋利的边缘,这在视觉上使表面外观稍微复杂化了。





我们的土地表面以多种类型的草(以随机散布的褶皱形式)作为补充。 该设备还具有广告牌模式(当草地总是向玩家注视时),但是它不适用于第一人称视角的播放,因为它太明显了,草地是如何“观看”我们的相机的。 您应该始终对草小心,并在合理的范围内添加草,因为这种乐趣会引发很多抽签,而这反过来又会影响性能。 调用次数越多,计算机系统上的负载就越高。 但不要忘记,挑战不仅会增加负担。 有很多方法可以消除游戏中的性能。 除了地面上的草之外,为了进行更改,还散布了带有树枝和石头的网格,以及一系列带有污垢和车轮痕迹的贴花。



创建表面后,转到植被,树木和灌木丛。 我更喜欢使用地形本身的工具(即用刷子)种植森林的主要部分(针叶树)。 这种方法的优点是可以快速,轻松地完成,而且距离很远,这样的森林就从网格转换为广告牌,这对优化产生了很大的影响。 但是,附近的负载大大增加了,因为据我了解,这种树木不会滚动。 也许我错了,有人会纠正我的。 精简是进行优化的非常重要的工具。 粗略地讲,这是一种将网格与一种材料组合在一个普通网格中的组合,这显着减少了调用次数,分别减少了负荷。 地形上座位的另一个缺点是树木的位置相同,也就是说,它们都是以相同的角度创建的,而且这种相似性令人震惊。 在这方面,我以不同的角度和大小手动安装了一些松树,云杉和落叶树,为景观增添了多样性。 灌木丛以相同的方式排列。





为了完整起见,它仍然需要面对天空。 对于此任务,使用具有六种纹理的普通天空盒材料。 曾尝试修改着色器,以使天空看起来动态,但结果并不能证明其合理性,因此必须放弃此想法。 另一种选择是使用带有云纹理的粒子系统和带有补间动画的水平广告牌。 据我所知,在《潜行者》游戏中使用了类似的选项,实际上还有很多其他地方。



灯饰


在Unity引擎的第4版中,有一个非常方便的模式来烘焙光照贴图-双重光照贴图。 当前版本中有一个类似的选项,但我尚未对其进行详细研究。 双重模式使我们可以在近距离实时绘制阴影和眩光,但是当我们离开相机时,这整个过程平稳地变成了烘焙的光照贴图,极大地简化了我们硬件的工作。 通常,我在游戏的所有位置上都使用了这种方法。 结果,对于每个中间位置,为近平面烘焙了一组大约5-10个光照贴图,而对于远处的光照贴图则进行了相似的处理(在背景中也使用了光照贴图,但仅在环境烘焙的环境中使用)。





总的来说,我在很多地方都尝试使用完全烘烤的光,除了太阳光。 将点光源放置在强调口音和更多光线的地方。 这主要是在几乎没有外部光线穿透的房间中完成的。 当然,在许多地方,还使用了带有阴影的riltimetime灯:来自火的光,台灯,天花板或壁灯。 顺便说一下,在使用照明时,我不得不处理与点光源和实时阴影有关的大问题。 在某些区域,相机凝视着带有阴影的点光源,令人毛骨悚然。 尚不清楚为什么负载如此之高,但此时的探查器显示了一秒钟的不合比例的抽奖。 为了纠正这种情况,使用了两个方向相反的聚光灯。 事实证明,此选项较轻。



型号


游戏的大多数3D模型都是独立创建的。 烘焙法线贴图和其他细微之处时,需要非常谨慎地做一些事情,并且为了节省时间而匆忙创建了一些东西。 大多数对象是按组创建的,并使用单个图集纹理。 也就是说,在一个纹理中,有一些部分,例如混凝土块,路标,砖屑,下水道舱口等。 这允许将一种材料用于所有这些对象,并因此使这些对象拍手。 我们记得,这很好。 我从互联网上免费图书馆免费下载了一些模型。 基本上,这些都是用于填充房间的小道具,但是,我尝试对所有这些模型进行一些修改,以使相似性不是很明显。 我经常在独立游戏中注意到相同的资产,这在某种程度上并不是以最佳方式影响了我的看法。 就创作而言,最有问题的是运输。 从头开始对轮式车辆进行建模非常耗时,并且会花费大量时间。 因此,我在Asset Store中购买了几辆汽车。







一个单独的“歌曲”是角色的创造。 这仍然是一个实验。 对于那些不了解需要多少工作才能使某个角色能够出现在游戏中的角色出现的人,我将进行解释。 创建具有所有细节,袖子上的纽扣,脸上的皱纹等的高模模型。 通过纹理扫描创建相同角色的低多边形模型(在我的游戏中,每个角色的多边形数量平均约为5到8000)。 此外,通过狡猾或简单的操作,从低多边形模型的高多边形模型中删除了法线贴图,环境(软阴影)贴图。 我通常从环境开始,然后在Photoshop中制作一个漫反射贴图。 在Alpha通道的漫反射贴图中,创建镜面贴图以创建光彩。





当然,对于2019年来说,它已经太原始了,但是对于独立项目来说已经16年了,它非常适合。

此外,我们的波斯人需要调情-在其中放置骨骼,这样他就可以移动四肢,下颌,弯曲和伸直手指等。 好吧,最后,整个过程都需要动起来。 通常为角色创建一组具有不同状态的动画:行走,奔跑,站立或坐姿。 但是也需要独特的片段,例如,对于我的英雄彼得罗维奇的搭档来说,就需要大量不同的动作:打开门,检查地图,与土匪打架,在Bor级投掷轻炸弹等。 所有这些都必须手工制作,当然,它的笨拙感非常明显。 通常,对人体运动进行手动动画制作是一项非常艰巨的任务,并且很难获得合理的结果。 因此,运动帽是最适合此任务的解决方案。 据我所知,尽管需要手动处理和“清理”接收到的数据,但此选项比动画师的工作更便宜,更快捷。



着色器


我马上要澄清一下,我当时非常肤浅地理解了着色器。 我的培训主要是分析现成的示例及其改进。 我从网络中获取了各种选项,更改了参数,添加了新选项或删除了旧选项,并检查了这如何影响结果。 原来,这是一个非常令人兴奋的活动。 我特别感兴趣的是处理不同的纹理通道作为蒙版。 在某些情况下,我尝试将最大量的信息放入一个纹理中并使用它。 在本文的开头,我提到了Unity的第四版和更高版本之间的差异,尤其是最新版本中存在物理正确阴影的地方。 我试图独自消除这一缺点,并使用镜面反射,cubmap和法线贴图将菲涅耳效果添加到标准着色器中。 这就是反射材料的特征,其中相对于我们的视图成一定角度的表面更强烈地反射环境(在这种情况下为立体图),并且通常看起来更轻和更具对比度。 这在一个光滑的球上非常明显,该球的边缘似乎比中心亮。 我能够重复这种效果,并增加了在材质中绘制cubmap的功能,我们通常可以在反射但粗糙的表面上看到这种效果。 该着色器完全适合我,并已应用于游戏中的大多数材质。





第二个有趣的经历是为角色皮肤创建了着色器。 基础是在Internet上找到的代码,该代码允许您使用渐变纹理,该渐变纹理负责影响模型的照明的强度和颜色。 中间带有淡红色的相似纹理使模仿人类皮肤成为可能,因为人类皮肤实际上是半透明的,也就是说具有自己的厚度,光在其中平滑地散射。 效果并不完美,但是看起来比标准的塑料凹凸镜更好。



除了上述着色器之外,还在此过程中创建了许多具有单独效果的辅助选项。 例如,具有立体贴图和扩散贴图变形的水坑着色器。 由于将真实的反射应用于水坑过于昂贵,并且我不想在纹理中使用渲染(这是将帧保存在纹理中并在材料中使用时,例如,在此期间可以使热空气变形),因此我决定对地面纹理进行简单的变形,伸过水坑。 效果非常好,根本不会拉伤铁。 附带地,具有纹理渲染的着色器用于扭曲煤油灯和篝火的空气。 似乎热与雷管资产发生了扭曲。 另外,为了模拟体积光线,创建了具有“柔和粒子”效果和边缘光效果的顶点着色器(当我们以一定角度查看多边形时,网格变为alpha)。 这是一种经典的且已经有胡须的实现方式。 现在,对于新的Unity,有一个很酷的选项可以在后期效果的基础上工作,并且即使考虑阴影,也可以绘制真实的光线。

另一个值得注意的是为模拟潮湿表面而制作的一组着色器。 游戏中有一段情节,在此情节中开始大雨,某些材料会平滑地呈现出独特的光泽。 主要效果应用于地形,在该地形上,如水坑一样,漫反射纹理开始变形。 漏水也出现在房屋的窗户上。 好吧,最“湿”的芯片是水滴落在镜头上。 实际上,在这里,我被疑惑折磨了,因为英雄既没有眼镜也没有头盔,而且液滴如何如此迷恋地在屏幕上炫耀还不清楚。 但是,视觉上我非常喜欢这种效果,以至于我无法拒绝它。



因此,我们顺利地进行后期效果处理。 说到屏幕上的墨滴,一切都很简单:纹理中的一些墨滴会以不同的速度倍增并向下移动。 并行地,波浪(渐变纹理)向下移动,并乘以各自的液滴组。 然后,可以将整个内容汇总起来,在“扩散”中稍作显示,可以这么说,但是它主要用作移动坐标的蒙版。 结果,水滴的折射使我们的图像失真。 相机上始终或可选的主要后效果集(如果玩家打开或关闭它们)是抗锯齿,SSAO,Bloom,Aberration,Vignette,Sun Shafts。 这些都是标准的Unity效果,但是对SSAO进行了修改,以便将阴影的渲染距离减少到零,因为在雾中的距离中阴影的暗点看起来很奇怪。 像差效果也发生了变化(这是使用镜头时图像的颜色失真,类似于物体边缘的颜色轮廓)。Unity的标准效果画出了物体的勃艮第绿色边缘(我认为这是一个很奇怪的解决方案)。 实际上,我意识到,大多数情况下颜色更接近黄红蓝。 另一个永久效果是自制的色彩校正。 在我看来,标准的Unity效果似乎过于占用资源,因此实现了自己的简化效果。 基本上,他创造了遮盖效果,并将配色方案略微更改为较冷的方案。 为图像选择调色板始终是一项艰巨的任务,这很难确定。 碰巧您可能会选择完全相反的选择,并且做出决定非常困难。 在这个项目中,我选择了暗淡和冷色调。 在许多人看来,她似乎太褪色了,但是在我看来,她非常准确地传达了我试图在游戏中反映的情绪,悲伤,沮丧和孤独的情绪。





那代码呢?


, . , “”, 35 . , . . ( ) , - , -. , , , — , -, , .. , , (, ), , .

, . - , - .



, . , , , . , NavMesh (, ).



. , ( ), . . , , , — . : , , .. , , , . . , : , — . , , , , , . , , .

Raycast. Subject, , ( — ) , , , , .

, , . “ “ , , . , (, , .). , , .



. , , , . , . , float , . , . , “”.


— , , “” . . : , , . LOD Group “” . . , . , 35 , , . 2-3 , 2 . : 15 , LOD 9 . ( , , , ), LOD 5 . ( , , ). . , , . , . , , ( LOD) .

第二种优化方法是遮挡剔除。在这种机制下,所有不在相机视野中或被其他物体关闭的东西都将被切断。例如,当我们进入房间,在墙后时,我们再也看不到街道上的许多物体,因此无需花费资源来渲染它们。



— . , “”. , . , ( , , ), (, , , .). : 40, 80 120 . , . , , , .


. , Adobe Audition. - , , . , , -, , — , , . , . , , , . , . , .

. , , . , , .

, - , , , , . , - . . , , . , .

, , . , - , - , , — . !

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


All Articles