虚幻三消,是一款我们新发布在 Android 和 iOS 平台上的游戏。最初起源于今年四月份的 Epic Friday 项目。 这款游戏主要是由我们几位在学习资源小组的同事创作——这个小组是一个 Epic 内部专注于创作各种学习材料的小组。
我们很多较小的学习资料都是仅使用蓝图来实现,这些都挺有价值的,但我们也了解需要在材料中添加 C++ 的范例。 我们先前在做头脑风暴的时候,Tom Looman 开始他的 C++ 下的生存游戏,于是我们也想在游戏类型和引擎展示上尝试不同的路线。 采用益智类游戏,比如三消,意味着我们能建立可以遵循的规则,这让我们能够专注在展示如何利用游戏引擎来实现它。
我们最初头脑风暴获得的清单,包括了一些并不是给简单范例的功能,比如 AI 和 数据表格(Data Tables)。 不过我们确实想要这些,来完成一个生动的范例,并慢慢加上各种功能。其中的某些功能可能最终会在我们制作的其他范例中。
虚幻三消的编码
在 Rihard 和我刚开始这个项目后,我们开始在我最初的原型上增加代码。当我们写代码的时候,我们坚守主要的三条原则。
首先,是要保持代码尽可能的通用。我最初的网格代码假设了四方形的网格,通常这是我们在三消中所需要的样子。 最终虚幻三消的代码中,参数化了这项,可以创建非四方形的网格,或者让玩家选择匹配 4 还是 5 或 6。 在开发时,我们甚至还考虑了多人支持,不过最终我们还是决定把这个功能从范例中移除了。
另外两个我们定下的设计原则都是关于在虚幻引擎中的面向对象编程的。我们希望使用框架类,诸如非常适用的 Game Instance,Game Mode 和 Player Controller。 我们的 Game Instance 处理了整个游戏的保存功能,以及向移动设备的服务发送信息,Game Mode 则关注三消的规则, 比如时间倒计时的数值。我们在写这些 C++ 类的时候,始终准备着策划们会希望在蓝图中使用它们, 即便后来我们进入了美术流程后,我们也会回头来扩展我们蓝图的调用接口。
在两个月的断断续续的编码后(我们同时还在做其他工作),我们完成了一个新鲜出炉的游戏,所有的美术都来自于我从其他学习素材范例中借用的美术资源,还有一些免费的虚幻商城的资源包。
注意这里缺少 HUD 的美术素材以及地形模式。我们的炸弹真的是盒子!
美术过程(以及后来)
是时候引入团队了。我们在六个月的时间有六个人兼职的工作在虚幻三消上。我们的美术,Mike,在几天内创作了一些贴图。 我们的声音工程师,Joey,在两天内搞出了很赞的声音。很高兴的能看到美术和设计工作能将项目推进演变的越来越像一个真正的游戏了。
随着团队变大,我们很高兴能将游戏逻辑保持在几个 C++ 类(也有几个蓝图)中。这样来,比如说 Wes 能够制作炸弹条的蓝图控件, 同时 Alan 能为不同的块状物制作爆炸特效。我们很少遭遇到某些人需要暂停手上的工作并上传以便于不阻碍其他人的工作。
在这个美术过程中有两个例子,能显示我们是如何设置类的继承关系和类的结构。
- 在 C++ 中,我们的 Tile 的基类处理类似于它是否能爆炸这种任务,还比如何时掉落的动画,给游戏系统反馈当前是否被选中等。 Tile 的蓝图类则继承 C++ 类,并增加一些简单的效果,比如浮在上面的分数显示。这样一来,视觉和听觉的效果基本上都是在蓝图中处理, 而基本的游戏规则(比如小块的动画)则在 C++ 中处理。
- 在项目中我们也一直在使用蓝图的原生事件,以及用蓝图实现的事件。比如,在完成了大部分声效的工作后,Joey 提议再为小块的掉落着地做一个声音。 因此我就在蓝图中实现了一个事件,该事件是当小块落地的逻辑发生时由代码调用,这样 Joey 便能很快的在蓝图中调用到新的声音并测试效果。
在虚幻三消项目进行设计工作和美术工作的同时,我们连接了移动平台上的服务,比如成就系统、排行榜、广告,以及内购。同时我们还在不同性能的移动设备上进行测试。
这些领域的进展也给我们带来一些有趣的问题,也有麻烦的问题。最终我们不得不为我们的内购而对关卡做大量调整,我们希望能够在最终项目中展示购买流程,但又不想影响游戏性。 顺便说一下,夜间皮肤主题是我最爱的部分之一。因为这里体现了这款游戏的美术和声音风格能具有多大的变化。
对排行榜和成就来说,我们起初设置了一个在线服务来冲裁成绩,在一个全面的游戏中,对高分的安全性考虑是不得不做的,这是理想情况下的做法。 但在来来回回的讨论后,我们最终的系统允许用户在高分和成就解锁的关卡内进行无论在线还是离线的游戏。
最后,在移动设备上,很庆幸我们测试了各种不同的设备。测试显示了一些我们起初并未考虑到的状况。我们重度使用了移动平台分析工作,以便于在不同的设备上都能获得最好的性能效果,并且画面也不至于牺牲太多。
那些进展不错的事情
作为虚幻三消项目的一员让我很开心,希望这个项目都其他虚幻引擎的项目能够有所帮助。这是一个移动项目的范例,C++/蓝图分离,事件驱动的UI,Paper 2D 的设定都能被其他项目借鉴。
- 我们利用已有的资源,并将项目范围控制在团队能力范围内。更多的在编码方面时,计划项目是我也了解了 2D 游戏风格的全貌,并由此进一步发挥。 由于我们作为小团队,并且顺便做的这个小木,将项目范围控制并完成才能帮助它走的更远。
- 虚幻三消的工作一度被戏称为“石头汤项目”,在这个项目中每个人都为项目的完成贡献力量。学习资源小组是这个项目的主要发开团队, 但我们也在整个公司范围内协同美术、声音、测试的人员,这是很棒的经验。
- 除了编写游戏外,我们还在线直播,并写文档解释项目设置,话题从 UI 设计到力回馈。
- 更重要的是,创作这种完整项目能帮我们找到开发中存在的主要障碍,以及如何将两个功能最好的结合。我们会将这些经验结合其他学习资料进一步整理制作。
- Wes 的这个说法我觉得不错,这里无耻的引用:“这对我们也是一个学习过程,我们也没有人用虚幻引擎 4 做完整的项目,我们每天也都在学习新的内容,和你们是一样的。 制作这个项目让我们能更多的接触引擎,并在引擎层面暴露更多的内容来改进工作过程和工作管线。最好的学习过程就是做一样东西,并在做的过程中学习需要学习的内容!”
- 每个人都在项目上发挥自己的能力。我们并没有定义每个人的明确角色,虽然这样偶尔会有小磕绊,但这能给团队在项目上具有归属感。
那些我们学到的事情
尽管这是一个给虚幻引擎社区的学习素材,但同时也能说我们在制作的过程中也学到很多。
- 由于我们没有为每个人定位角色,因此有时候在决定游戏性的策划决策时,或者美术风格时,需要一些方法。每个人都能表达观点当然是好事, 但有时也需要明确的决策执行才能保持项目向前推进。游戏设计文档在这个问题上具有很大帮助——要不是我们还需要兼顾教学的方面,我们能在整体的游戏性上做更好更细的计划。
- 我们很早就做到了可玩版本的状态,在临近发行的时候最后都投入在改 bug 和测试上了。这绝对不是这个项目或者我们团队特有的情形。因此在"发行前只需要做这几件小事"的时候需要明白这些。
- UI 的缩放是我们花了大量时间来修正并测试的一个功能。一部分的原因是我们最初根据每个设备来改变 UI,而不是先做通用的改动,再对逐个设备修正。如同优化一样,UI 的缩放应当从通用到特例,并且每次都做较小的改变。
- Mike 制作了很多小块的美术和 UI 材质,他在其他项目上也很忙,因此如果我们有更多时间的时候我们就会迭代调整多次。最终我们都是根据美术来调整游戏,而非根据游戏调整美术。 我们这里学到的经验是,当和团队外部协作时,沟通是关键,因为团队缺少人手,内部的期望并不总能有效传达。
虚幻三消的碎碎念
- 范例测试的游戏局数:1,979
- 非官方测试人员/虚幻三消粉丝团的游戏局数:101,979
- 圆圈蛋糕在开发期间的消费数量:20
- 最受欢迎的游戏模式:二消
希望大家和我们只做这个项目一样能喜欢这个项目,这是我们第一次完成一个主要的范例,并且附有大量文档,并最终以一个有趣的游戏来展现!
可以在学习的分页中,或者 Google Play 和 iOS App Store (即将上线)看到。可以在论坛中给我们反馈。