让关卡制作事半功倍:资深开发者分享定制化工具打造经验
【ashkeling专稿,未经授权不得转载】
ashkeling报道/如果只用一半时间就可以做出同样的内容,你会怎么想?如果你知道不仅可以节约大量时间,还可以通过日常的重复行为节约很多比较短的时间会怎样?对于游戏开发者而言,我们应该用定制化工具更聪明地工作,而不是更刻苦。
在此前的GDC分享中,资深游戏开发者Brett Taylor分享了定制化工具以及它带来的不同帮助,并通过案例分析的方式讨论了什么时候应该制作工具,以及哪些时候投入工具是浪费时间。在演讲的最后,Taylor还分享了一些Unity代码快捷方式,希望对同行们有所帮助。
以下是Gamelook听译的完整内容:
Brett Taylor:
首先做一下自我介绍,我是Brett Taylor,在哥伦比亚大学拿到了认知学硕士学位,自从2008年开始就已经在研发游戏。
从业经历方面,我在Arkadium工作室度过了三年的开发者生涯,转入独立游戏研发之后,做了一款名为《ob电竞》的游戏,并且有不错的表现。最近我还成为了Playdead工作室的一名开发者。
今天的分享主要分为四个部分,首先谈谈什么是定制工具,然后聊聊关卡编辑器,我这些年做了很多个关卡编辑器,这也是一种类型的工具。随后,我们会讨论什么时候适合做一个工具,最后会介绍一些Unity代码快捷方式,这么多年的研发过程中,我积累了大量的快捷方法,对于Unity开发者来说是有帮助的,我会在随后分享一个链接,需要的同行可以直接使用。
什么是定制化工具?
你们可能会问,定制工具到底是什么?按照我的定义,能够帮助策划以及程序员节约时间的代码或系统,就是定制化工具。
其中最重要的就是节约时间,因为定制化工具的最大意义就是让你做游戏更快。不过,我并不总是使用这些工具,今天分享的重点是能够帮助同行们节约时间和精力的工具,而不是如何打造最优秀的研发工具。
具体来说,今天讲的工具主要是与游戏策划有关,而不是bug查找那样的游戏制作工具,我今天分享的工具主要是为了方便策划为游戏增加内容,帮助策划处于最佳状态或者行云流水的状态。
假如你每天可以12次节约20秒的时间,如果是通过工具实现,那么投入工作制作的时间(如果是4分钟)是否值得?你失去的并不只是4分钟,而是作为游戏策划,这个工具制作时间打断了你的流畅状态,所以,当我谈到是否值得制作工具的时候,不只是它节约了多少时间,更重要的是它能否保证你处于最佳状态,以更有效率的状态工作。
最佳状态指的是,当你创作内容的时候不被打断,意味着更高的工作效率,不过,在必要的时候,也需要能够很容易打断。
我们再来谈谈Bob Ross,以及他的“节约时间模型(time-saving role model)”。Ross是1990年代公共广播电视节目“欢乐画室”系列主持人,他平均作画时间在22-23分钟左右,其中使用了很多捷径方式。
他曾公开表示,“这是懒人作画方式”。但我认为这是非常聪明的绘画方式,这样作画是非常高效率的,节约了大量时间。
工具也分为不同类型,比如它可以小到只是一串可重复使用的代码,也可以大到一个功能丰富的关卡编辑器,图片中的编辑器是我在10多年前做的,随后我们会提到它。
我们可以做帮助策划为游戏内增加内容的策划工具,还有帮助程序员的可复用代码段甚至是代码库,今天的分享主要是针对策划工具,不过在最后我们也会分享一些Unity代码。
策划工具还包括关卡编辑器以及能够突出关卡问题的工具,比如帮助组织关卡结构的工具,或者,你也可以做分支剧情的文本编辑器。
关卡编辑器案例
《ob电竞》
这是我做的第一款游戏,图中是它的关卡编辑器。这是我有史以来做的首个关卡编辑器,是在大学期间(2010年)完成的,其中很大一部分灵感来自《ob电竞》编辑器,实际上整个游戏灵感也是来自《ob电竞》,只不过把操控时间切换成了操控空间。
《ob电竞》整个游戏时长只有半个小时,但它的关卡编辑器却是很不可思议的,因为我做了很多的功能。
总结来说,整个关卡编辑器用了3个月时间,坦白来说,与我做工具投入的时间和精力相比,它带来的回报并不是很多,虽然有很多功能,但并不值得。不过,值得庆幸的是,通过这个关卡编辑器的制作,我学到了很多东西。
《ob电竞》关卡编辑器
这款游戏发布于2017年,从《ob电竞》编辑器,我学到了很多不能增加到工具里的东西。在《ob电竞》编辑器里,你可以在玩游戏的时候进行编辑,因此使用起来很方便。
实际上,一开始的时候,我做了几个关卡,但并没有意识到需要做编辑器,我最开始设计关卡都是用代码写出来的。随后,我意识到必须打造一个关卡编辑器,这刚好与《ob电竞》相反,那时候我是先做了关卡编辑器,然后增加了很多并不需要的功能,虽然学到了很多东西,但那并不是有效率的做事方法。
这个编辑器打造用了大约一个月的时间,整个游戏用了一年半,但这个关卡编辑器带来的结果是巨大的,快速迭代是非常好的,因为我只做自己需要的功能,甚至有些东西是Unity默认的。开始的时候我想着随后把它做的更漂亮,但后来我发现既然行之有效,那就没有必要做的多么漂亮,因为并不值得。
《ob电竞》的地图编辑器也同样复杂,而且里面增加了很多的功能,这些是我在研发过程中逐渐加入的,接下来我会用具体的关卡来展示一些功能。
设计师标示
这是我在几年前做的,也是为《ob电竞》设计的,随后也用到了其他一些游戏之中。这五个标示是我希望在关卡中使用的,每个关卡都有标示,你可以点击icon切换,它直接可以在编辑器中使用。我很喜欢这个系统,它的表现非常好,因为关卡是处于不断变化中的,一直要重新调整这些关卡,有了标示之后,我就不用记住对每个关卡的想法,因为这些标示已经存在。
这个系统用了我5个小时完成,但它带来的结果是非常优秀的。
Prop Display
这是一个与设计师标示相似的东西,它展示了地图上的一些内容。我的目标是让地图资源在研发进度中实现视觉化,展示这个房间里存在的游戏机制,比如图中白色的标记,我希望能够直觉看到一个区域里的游戏流程。
不过,这个系统最终几乎是很少使用,我本以为它可以带来很大帮助,但结果并没有奏效。我用了3个半小时做这个系统,但结果几乎一点用都没有。当然,这也是学习过程的一部分。
《ob电竞》
我们先来看看这款游戏长什么样:你控制角色Jetta进行跳跃,到达出口即可通关。
这是《ob电竞》地图编辑器,你可以把地图的任何一段拖走、改变位置,它们会自动连接起来。
它还可以自动找到布局问题,如果某一块地图无法与其他区域连接,就会被标注出来,这对我而言是非常有用的。做了很多的关卡之后,还可以按住shift键输入名字,搜索具体关卡。还有一个功能是shift+鼠标点击,可以选择所有连接起来的房间。
我们再来看《ob电竞》房间编辑器,它直接使用了Unity编辑器,所以在研发过程中可以直接看到游戏内实际效果。它有一些优势,这个编辑器是已经存在的,我不需要再做一些额外的功能,比如回撤或者重做,尤其是多选、多个物体移动或者多个目标规模化的时候,比自己做编辑器方便很多。
不过,这种方式也有些不利之处,比如,你需要单独的视窗看到游戏玩法,而不是直接在游戏里编辑,我很不喜欢这一点,因为它会让编辑器当中的一切都看起来很小。另外,对于一些不适应的Unity功能,我还需要找到如何变通的方法。
接下来看看这个房间编辑器里的一些功能:
吸附到网格线(snap to grid),这个功能很棒,它的代码也很简单;
自动旋转尖刺,这个功能也很不错,随后还会提到该功能,简而言之,当你把尖刺拖动到某个表面,它的方向就会自动适应其方向。
自动延展层次体系,如图,如果要手动展开这些层级目录,我需要三次点击、耗时7秒才能看看到所有内容,而使用了自动延展代码之后,就可以立即看到这些内容,这节约了大量时间。
还有一个功能是键盘快捷键,图中展示了一些快捷键,在关卡之间切换很好用,这样的快捷键有很多,但我们没时间逐一介绍。
展示房间连接错配的线框(小工具),黄线处展示的是打开的其他房间,这样,我不用频繁回到大量的关卡,就可以知道哪些关卡的房间连接出现了问题。
《ob电竞》
另一个是我做的《ob电竞》,不过这个项目从未发布,它停留在了概念阶段。游戏的想法是通过选择的方式展示音乐剧情,所有的文本都与你听到的音乐有关,并不是一个很有趣的挑战。
我希望用一个无障碍系统将支线故事与音乐编组并连接起来,但这是一个很困难的挑战,我希望可以快速创作内容,而不必担心内容创作需要投入很多工作量,结果证明这是一个噩梦。我一开始就做了尝试,但非常耗时间,我的目标是快速实现想法。
从图中可以看到,我直接将很多数据写入了代码中,希望它能够直接写出对应的对话文本,这的确可以将音乐与文本匹配,但我觉得结果给人的感觉还是非常奇怪,结果还不如自己直接做分支剧情。
《ob电竞》
这是一款休闲手游,我们希望为它做1000多个关卡,然而我们只有三周的时间完成,这是非常不切实际的,而且我还是这款游戏唯一的开发者。考虑到游戏规则,程序化关卡生成会变得非常复杂,因此我不得不手动制作。
投入了2小时制作关卡之后,我感到压力很大,因为这么短的时间根本不可能做出那么多的关卡。所以,我给自己的手机做了个编辑器,如图:
首先,我们生成一个完全随机的关卡,带有可调节的参数,在游玩过程中可以手动编辑,你可以控制关卡中的内容,也可以完全去掉某些东西,还加入了保存关卡选项。最后,一个关卡制作只需要45秒左右即可完成,包括那些需要几分钟才能完成的高难度关卡。
我可以在醒来之后做关卡,可以在地铁通勤路上,或者睡觉前,都可以随时随地编辑关卡,而且不会影响我的工作计划。
这个关卡编辑器总共用了3天时间,它带来的结果是拯救了我的精神健康,如果没有这个编辑器,1000多个关卡可能会让我手忙脚乱到崩溃。
什么时候适合做工具?
我的建议是,先“侵入(hack in)”内容,做一些实际的内容,让关卡做到可玩。一旦有了可玩内容,你就会知道你需要或者不需要什么工具,提前做这些工具,除非你不知道,否则提前准备总不会有错。
比如,之前的《ob电竞》案例中,我用代码写了一些关卡,主要是希望测试游戏的可行性,最终成为了《ob电竞》关卡编辑器。
你可能会浪费比想象中更多的时间。
所以,我的建议是先搞清楚你的偏好是什么,然后对此提出质疑,比如,你是否不慌不忙?如果不介意做重复动作,那么专门做工具是否有必要?或者,如果你希望提升效率,在想到的时候就去打造一个工具?
假设你不慌不忙,这时候要了解重复动作或者等待工具完成会浪费多少时间,比如,大量重命名/编辑文件,而且每周要做两次以上。或者,需要离开鼠标、目视远方一段时间,这种情况也会发生;或者,每次代码编辑都需要等待15秒以上重新编译,那很可能有方法节约时间。
另外,挑战你的沾沾自喜,节约时间可能比你想象的容易很多,有些任务节约30%的时间可能并不需要投入很多精力。
如果你和我一样,希望提升效率,我的建议是先做一些内容,然后看是否需要做一个工具,而不是反过来先做工具。因为,游戏设计很可能会发生变化,你做的工具越是具体化,那么它被淘汰的概率就会越高。
这就涉及到沉没成本悖论,假设你为XYZ做了一个工具,对于开发者或者游戏策划来说,砍掉或者改变XYZ功能就会越困难。比如,某些功能应该被砍掉,但由于做了工具,你可能并不会那么做,但这对游戏并不是正确的决定,如果不事先做工具,就可以避开这种情况。
我投入工具制作的门槛,是在没有工具的情况下,到底会带来多大的麻烦。我首先会尝试在没有工具的情况下研发,如果一件事不断地让我觉得烦躁或者效率很低,或许就会考虑专门做一个工具,当然,也有些时候并不会这么做。
随后,我会思考的是,做一个工具可能需要多久、做出来之后能够为我节约多少时间?
一个比较有代表性的案例就是前面我们提过的尖刺旋转,在《ob电竞》当中旋转一个尖刺需要选定目标、选择旋转角度,游戏里有很多的尖刺,这个过程会带来很大的麻烦。
这种情况持续了几周,然后我问自己,加速这个过程最简单的方法是什么?我可以ctrl+R控制它旋转90度,这需要我投入15分钟。
这种方法更好一些,但依然感觉很笨拙。随后我又问自己,做到自动旋转尖刺需要多久?答案是可能需要2小时左右。那么,我是否想要为它做编程呢?这当然是有意义的。
我为它用掉了一个半小时,最终也为我节约了大量时间。一次旋转只需要10秒左右的时间,如果每天要做50次旋转,这意味着每个月我只需要投入3个小时,而且让关卡设计流程更加流畅。
用90分钟的时间,换来这样的结果,当然是非常不错的。
这是我给错位房间设计的另一个工具,如果放大来看,可以看到这些房间之间实际上并不匹配,这是个问题,因为你很难直接看到。所以,我希望增加一个功能,能够凸显这些错误,让你知道需要解决这个问题,这对游戏策划很有帮助。
于是我问自己,是否想要增加这个功能?答案是否定的,因为这个问题带来的麻烦并不是很大。所以,最终我没有增加这个功能。
那么,对于这些情况,是否有正确的答案呢?显然没有,因为游戏研发本身就是一团乱麻,每个人都有自己的梳理方式。
不完整的工具
我做了很多不完整的工具,毕竟,我们的目标是节约时间,而不是做一款神奇的工具。比如,《ob电竞》编辑器有很多的bug,比如,打开一个关卡需要快速点击2-10次,有些关卡的rect bounds还是错误的,而且,连接不同关卡依然需要手动实现。我并没有去解决这些问题,因为没有那个必要,这些问题可能会浪费时间,但为此专门做工具所节约的时间并不值得。
最后,我复制了《ob电竞》很多的代码,解决了很多问题,所以,这并不一定是最好的答案。
Unity代码快捷方式(code shorts)
需要声明的是,这些快捷方式仅适用于Unity研发,其中很多的东西都是我这么多年研发经验积累的。它们当中很多都被我复制到了新项目里,都可以节约一些时间,你们不一定需要直接照搬,但可以作为启发,也可以节约很多时间。
如果感兴趣,可以到图片上方的链接下载并使用这些快捷方式,我这里也会举一些例子。比如每次脚本刷新都需要重新加载场景,在Unity当中,如果重新编译,整个项目有可能会崩溃。基本上,屏幕中的这些代码,就可以起到作用,至少对我来说,不必在每次改变之后停止或者运行项目,就可以自动重新加载场景。对于开发者来说,这些代码至少可以为每次改动节约10秒钟以上,尤其是对于比较大的项目来说,它节省下来的时间更多。
吸附到网格线,这是它的代码,非常简单,而且实用。
我还做了很多结构体(struct)用于不同项目,比如Color255.cs,ColorHSB.cs,都可以节约大量时间。还有Vector2Int.cs,基本上每款网格游戏我都会用到。
GameUtils.cs几乎用在了我所有项目中的静态类(static class)当中,它可以用到大量的常见函数当中,比如按像素设置SpriteRenderer大小,设置UIGraphic alpha、改变粒子系统属性、设置编辑器镜头位置等等。
MathUtils.cs与上面的快捷方式很像,它可以返回随机bool,还可以合并两个矩形、让一些小数点位数变成整数。Vector2有些功能是没有内置的,比如绝对值、最大值、最小值等等,不过MathUtils.cs可以做到。
总结
我的第一个建议是避免笼统的工具。你可能想要一劳永逸,做一个工具、然后运用到所有新项目之中,个人认为,不要这么做,最好是为你的游戏做特别的工具,比如《ob电竞》编辑器就是专门为这款游戏打造的,而且只需要几个小时就可以完成。实际上,其中的一些代码还可以用到其他具备类似功能的游戏中。
如果工具给你的感觉是“不完整”,没有关系,因为它大概率会和游戏给你的感觉一样不完美,你总会有更多东西想要加入到游戏中,所以不完整也没关系。
犯错也是可以接受的,因为这不过是另一种学习方式,也是生活的一部分。
优秀的工具可以让游戏策划处于最佳状态,所以工具不仅是节约时间,还可以让游戏设计更加流畅。我建议同行们认真检查自己的流程,然后发现在哪些地方浪费了时间,如果你发现自己经常重复一些动作,这时候最好是做一个工具;如果只是自己喜欢增加工具,那么我建议先做一些内容,然后看是否需要为之做工具。
另外,定制工具还可以提升你对编程的兴趣或者热情,比如我就对编程越来越感兴趣,这个建议不只是针对Unity,而是适用于所有引擎,以上就是今天分享的全部内容。
如若转载,请注明出处:http://www.ashkeling.com/2022/08/493602