对于独立游戏开发者而言,由于人手和资源的限制,往往会导致很多想法和内容无法做到游戏当中。不过,独立开发者 表示,只要将每个项目积累的工具收集起来并不断优化迭代,即便是单枪匹马也能提升研发效率。
在2021年的GDC分享中,他详细探讨了如何清理旧脚本、并且让它们可以在多个项目当中使用,帮助同行们在没有庞大团队的情况下也能完成更大的游戏。
以下是听译的全部内容:
:
我是一名做游戏研发的自由职业者,目前在研发一款叫做《中秋()》的游戏。之所以说我是自由职业者,是因为我不属于任何一个具体的工作室,在从业生涯当中,我大部分时间都在跟不同规模的工作室合作,主要是做外包,有时候可能只有一周,有时候会合作一个月,还有些时候可能兼职半年。
游戏业做研发有很多方式,但我的从业经验是,每一个参与过的项目、做过的内容都可以帮助我成长,以便在后来更快地做游戏研发,这也就是我今天主要想说的“代码库(Code )”。
这里需要提前声明的是,我只是一个单枪匹马的开发者,所以观点可能并不适合所有人,如果你觉得本文的有些建议不适合你,只要忽略就可以。我主要说的是帮我解决游戏研发复杂度的工具,尤其是当你远程工作、没有人可以讨论的时候,所以,如果你也遭遇这样的情况而且不知道如何解决,这里可能会有些方法帮到你。
做游戏本身就已经是很困难了,我们不要把它变得更难。
我记得《宝可梦剑盾》发布的时候,很多人说他们重复使用一些角色的模型,我对这样的做法是支持的,因为在有限的时间内,你没有必要给每个角色都做100种不同的版本。
所以有些东西是可以复用的,完成一个项目就已经足够令人生畏了,在第一款游戏的时候,你会学到很多不知道的东西,一旦完成,可能就会想要做下一款游戏。
第二款游戏的研发会更难,因为你已经知道了做一款游戏都需要些什么,而且也知道前一个项目做了什么。
如果你处于这个状态,那么我可以说的是,你现在比大多数开发者都有了更多的准备,就像是海上的蝙蝠侠,他已经知道了如何对付鲨鱼。
我们也可以像蝙蝠侠一样,游戏实际上就是一些组件合成的鲨鱼,你有需要解决的问题、植入游戏的功能等等,你首先要准备驱鲨剂,也就是代码表,然后做成能力腰带(代码库),当鲨鱼出现的时候,你就可以解决它了。
这里我说的代码库,指的是一系列有帮助的资源,它们是可复用的,而且是可复用很多次。它必须在某个地方留有备份,而且不止是代码,还包括所有能够帮你的工具,比如喜欢用的软件、设置检查列表、文档、经常看的视频或者文章等等,这些都应该被加入到你的代码库。
本质上来说,回到鲨鱼的问题,在你的代码库里,你想要所有的东西都能够解决一个具体问题,而且是可以复用的。驱鲨剂只能解决鲨鱼,所以代码库里的东西应该很轻、不需要大量的设置,还需要能够很容易与其他东西组合起来。
如何维护代码库?
在代码库当中,你很明显不需要整个项目的所有文件、有些在其他项目中不会出现的内容。但是,如果有需要的话,你仍然需要能够查阅这些资料。
还要注意的是,不要把不属于你的东西放进来,有些时候某些资源给了你授权,但过段时间之后授权过期,这些东西也不适合放在代码库当中,因为它可能在未来给你造成麻烦。
做代码库的基本流程就像是做家务,所以最好的时机就是完成一个项目之后、开始另一个项目之前。你要在旧项目当中寻找一些想要复用的代码、资源,把所有只适合这个项目的东西去掉,然后取一个容易记住的名字,放在能够很容易看到的地方,确保你有一个文件管理系统,这一点我们稍后再说。
主要提醒的是,不要想着把它做到完美,这只是一个良好的习惯,每天可能只需要投入几个小时的时间。而且你可能会忽视一些东西或者将一些不必要的东西放进去,这都没有关系,你可以在随后进行调整与修改。
我是如何识别代码库要放的内容呢?这里是一个非鲨鱼模型的游戏解构图:
它包括组件、核心内容、Meta机制和衍生系统。
比如这张图当中的象棋桌和棋子就是我所说的组件,在游戏里,就是角色、生命系统、物理效果、建筑等等。
核心内容包括游戏管理器、资源系统以及资源掉落相关的功能,它们将游戏组件变成了游戏;meta机制就像是象棋锦标赛,向其本身是有规则的,但锦标赛还有自己的规则,这样才能让参与者不断向上挑战,相当于游戏里的进度系统、任务系统等等。
接下来就是衍生系统,我把它比作锦标赛场地,这些建筑可能并不是专门为了象棋比赛而建造,就像是游戏里的菜单、本地化、存档系统等,无论做什么游戏,几乎都需要这些东西。按照这个方式理解游戏,你可能会更容易对能够复用的东西进行分类。
找到了这些东西之后,你可以把它存在版本控制平台,也可以存在各种云端软件。我是按照系统进行管理的,比如对话系统、菜单系统、存档/加载和设定系统等。
当然,你还可以根据任务来管理,比如描述创意原型的脚本、动画、资源创作等等,你可能会重复做很多东西,但也是不一样的管理方式。
你还可以根据上面提到的游戏结构进行管理,这对于我是很有帮助的,如果你觉得有用,也可以按照这种方式管理代码库。
案例
我将会用《中秋》作为例子,因为这个项目就是使用了我的“代码库”打造出来的。这是一款游戏,主题是亚洲离散文化,我已经放在了平台。
案例1:做一个能在不同项目重复使用的音效控制器
这是我之前做的一个RPG游戏,叫做《》,当时做了一个音效控制器,,实际上只是一系列的音频剪辑列表,它有一些基础的播放方式,我可以设定音量、场景,还可以随机播放脚步声、对话声、攻击的声音等等,它们只需要被使用一次,而且没有很复杂的设置。
不过,在你的代码库当中,最好不要让所有东西都只能使用一次。
所以我对它进行了调整,虽然看起来依然很像,但我增加了一些可能在其他项目想要使用的东西, 放弃了所有比较具象化的资源,比如脚步声等等。
案例2:将同样的对话系统拓展至不同品类
这里的案例依然是上面两款游戏,在《》当中,我做了一些弹出的对泡泡,做《中秋》的时候,我加入了对话盒子,还在屏幕里放了角色形象。
虽然表现方式不同,但它们的对话系统实际上是一样的。
这是对话系统的整体脚本,包括对话内容、角色以及故事节点。
在《》里,对话是与玩法同步发生的,所有对话都是我写的。游戏里有3D角色,他们可以移动而且会有角色动画,对话泡泡会出现在说话者的上方。
可以看到,在《中秋》当中,我做了比较明显的变化,比如对话台词是与角色数据、动画和展示时间相连的,角色这一块也改成了角色数据,包括了相关颜色、非对话相关数据等等;故事节点还设计了自动推进以及可以引入CG场景的信箱等。
在《中秋》当中,对话推动了玩法进度,意味着事情是否发生会取决于你有没有听过特定的对话,我们做了程序化的对话池,所以每次对话都可能是随机的。对话盒子永远出现在游戏屏幕中的固定位置,每个角色都有一个高分辨率的形象。
每次有新角色出现的时候,我都要检查与之相关的故事节点,你们可以注意到,我还增加了解锁节奏、消失以及共存节奏等等,因为游戏进度是对话推动的,所以你要知道玩家听过了哪些对话、接下来要听到什么,哪怕是随机内容。
案例3:拓展通用敌人控制器,快速增加多样化的敌人
做《》的时候,我设计了一个通用的敌人控制器,很多都是通过比较虚拟的方式来定义,比如我想要做一个子职业的敌人,只需要改变一个动作方式即可,如果不需要,就使用默认行为。
这个控制器涉及很多的方面,比如敌人重生的方式、如何选择下一个状态,以及行为的更新、攻击方式和死亡等等。
如果仔细观看,你们可以看到敌人攻击的时候都是有特效的,包括近战攻击,所有类型的敌人都具备这个能力。我还为敌人增加了标签系统,比如图中的乌龟,当你攻击的时候,它们的壳会承受伤害,而本体不会受到伤害,意味着你是无法攻击到它的。
我用这个系统做的第一个敌人是简单的近战敌人,它会慢慢接近玩家,到一定距离之后就会发起攻击。当我做新敌人的时候,增加了两个标签:近战、远程。
实际上,这两个敌人的健康值、外观和攻击方式可能不同,但它们实际上都用了同样的。
随后我增加了带盾的敌人,它的主要变化是可以用盾承受伤害,不过最有趣的是,我可以在此基础上做更困难、更复杂的敌人类型。
做完三种敌人之后,我开始做游戏boss,因为有了这些方法之后,你实际上可以很快做出独特的Boss。在带盾敌人的基础上,我增加了选择下一个行为的射击,还做了不同的攻击方式以及承受伤害的反应,比如生命值减少一半之后会进入狂怒状态,在Boss死亡的时候,我只是增加了对话脚本,增加了新的Boss标签。
接下来我做了第二个Boss,因为这么做很容易,仔细观察,我们会发现两者的核心逻辑是一样的,当然还做了很多的差异化,这里不详细描述。最大的不同在于,新Boss增加了更多的剧情,比如它的目标和动机,还做了不同的击败对话。
这是完全不同类型的敌人,因为做了两个Boss之后,我在想如何做出新的敌人类型。这次我加入的标签是“升级”,比如一开始它可能只是个小蘑菇一样的怪物,升级之后变的更强大。
这个怪物的设计也没有用很长时间,我只是改变了敌人行为、攻击方式并且增加了一个新标签。它会主动升级,如果还没有升级,就会寻找可以让它升级的资源去吃掉,升级之后的攻击方式也会变化。
这里比较大的区别在于增加了升级和降级两种方式,后者还没有使用,但如果有需要也可以加入,比如升级后的敌人遭受足够伤害之后降级、能力变低。
这是今天说的最后一个敌人,是一个可以有毒的敌人,如果玩家离它们较近,敌人就会被动释放有毒粒子。我只是更新了它的攻击方式,增加了有毒标签,实际上每次做新敌人大概都只需要用一个小时左右,因为有了这个控制器之后做起来其实很简单,我只需要思考如何将敌人类型多元化就可以了。
代码库有哪些优势?
1.快速创意原型
有了这些代码库之后,它给我的研发带来了很大的帮助。比如在创意原型阶段,我在做自己游戏项目的时候,依然可以每周抽出40个小时做外包,而且每一个创意原型所用的时间和精力都变得更少了。
通过这种方式,也可以降低沉没成本,比如你可以尝试更多的创意原型,如果觉得行不通可以立即停掉,不会造成特别大的损失。另外,这些代码库也让我在使用Unity引擎做研发的时候更加舒服,特别是你没有团队支持的时候,就特别需要有工具提升研发效率。