嗨嗨大家好,这里是克系游戏开发者独游凯恩。今天下午去上架子鼓课,学会了新的节奏型,下课后往家走,突然意识到节奏型跟程序代码的结构体本质上差不多,进而又想到音乐和编程其实本质上也有非常多的共同点,再进一步推演,似乎可以推而广之到“设计理念”的泛用性上。不过先不说那么远,让我们先从节奏型开始,重新审视一下游戏设计中的“结构”这个概念。
架子鼓常用的部分有三个,分别是底鼓、军鼓和踩镲,一般来说底鼓的鼓点我们读起来是“动”,军鼓读起来是“打”,踩镲读起来是“次”,于是大家耳熟能详的“动次打次”其实就是“底鼓-踩镲-军鼓-踩镲”的循环敲击。
这种固定套路的敲击顺序就是节奏型,比如今天我们学习的乐曲中有一个标准的节奏型是“动动打动”,还有一个是“次动打动”,如果把几个节奏型连接起来就可以形成一个更长的节奏型,比如“动次打次-动动打动-动动打动-次动打动”,在一首曲子中,这样的节奏型可以重复演奏,学会了基础循环再反复利用即可大幅提升演奏效果。
现在我们尝试用gdscript来还原一下打架子鼓的演奏行为:

这样在曲子的前半段中,我基本上只要反复调用 基础节奏型() 6~8遍即可。同理可得其他的节奏型,只要使用3种不同的节奏型就能把整首曲子完整地演奏下来了。
我们可以清晰地看到,使用鼓谱演奏一首音乐,抽象成对肢体和物体交互的逻辑重新整理,就变成了代码脚本的撰写。而“肢体和物体交互”如果变成“手指和键鼠交互”,是不是就是我们玩家日常在玩游戏时进行的动作?所以代码逻辑和作曲逻辑真的有太多相通的点。
一个游戏可能包含了千千万万个脚本,就像一首交响乐包含了千千万万张谱子。每个脚本里可能包含了千千万万个函数,就像一张谱子里的千千万万个小节。我们自然可以手动编辑每个函数的内容,在每个函数中重新定义私有变量,重新写复杂的逻辑,但这无疑是低效的。因此有一个可以被其他函数反复调用的公共变量、公共结构体就会大大提高代码的可读性、整理起来更方便,对电脑的性能压力也更小。
每一个可被反复使用的“公共内容”我们就可以视为一个基础结构,比如一个小节的动次打次。我们可以把动次打次放在一个更大的基础节奏型或其他节奏型中,还可以把基础节奏型放在更大的章节循环中,这种大肠包小肠的方式就是结构嵌套。
所以我们会发现,结构的一个非常直接的功效就是“可复用性”,可以像叠叠乐那样利用基础结构拼凑出更高级更复杂的上层结构。
那么游戏设计中的结构等于玩法吗?并不是。但我们可以反过来说,对于一套复杂玩法来说,每一个基础玩法都可以视为一个基础结构。同理,对于一个复杂关卡来说,每一个基础关卡都可以视为一个基础结构。对于复杂数值、复杂场景、复杂叙事等等,我们都可以用一种方式去深挖他基础循环中的单一组成部分,这个最小单元就是一个结构。
一个稳定结构有什么好处?大家一定听说过“涌现式设计”吧,就是玩家利用游戏中现有的基础玩法可以达成一些非常有趣的游戏体验,这些体验很多并不是设计师在一开始就定死的,而是随着玩家自发性探索而涌现出来的。对于一个包含了大量稳定结构的游戏系统来说,只要通过组合不同的系统就能产生更多的游玩体验,这节省了开发成本,提升了玩家乐趣,提升了游戏时长,是一件事半功倍的事情。
刚才说到结构是可复用的,有的朋友应该注意到我举例的时候提到了复杂叙事。众所周知,叙事向的游戏,或者说内容型游戏的很多文本资产是不可服用的,那怎么理解叙事中的结构呢?我如果说“三段式”大家应该已经懂了。起因经过结果这就是一个包含了3种基础结构的叙事逻辑,再复杂一点变成起承转合,再复杂一点变成七幕式,再复杂一点变成英雄之旅,等等。结构不等同于文本,而是故事在撰写时的一种最小叙事目的。一个短篇小说可能每一个自然段都包含了核心的叙事目的,那么每一个自然段都是一个基础结构,如果套用这些基础结构我们只要换一个题材就可以复写出节奏完全相同但是故事内容完全不同的另一篇小说了。是不是很有意思?
用结构化的思维来看游戏开发,先自上而下进行框架设计:我的游戏包含哪些部分,玩法上、叙事上、美学上,每一个部分又需要哪些技术支撑才能实现,每个功能都应该有哪些基础结构?……
随后自下而上开发功能:先确定有没有可以并行开发的,没有的话大框架上的优先级如何,在每个大框架下的子功能们优先级又如何,从最优先的最小功能进行开发……这样项目管理也会非常清晰,评估可落地性、成本都有理可依。
结构是一个抽象的概念,但我们确实可以感受到一款游戏是否结构清晰、结构精美。在设计过程中时刻注意用结构性思维审视自己的游戏,可以让各部分都保持独立,也就是俗称的“解耦”,这样能有效避免不同功能彼此粘连剪不断理还乱。
当我们的每一个基础结构都逻辑清晰,再用充满设计感的方式进行拼接,这样就可以做出好玩并且结构严谨的游戏了。