卷 V · 造CH 18深度 18/24

原型:用最丑的方式回答一个问题

大多数人写的不是原型,是「游戏的早期版本」—— 他们从第一天就在写打算保留的代码,于是每一个决定都很沉重,改起来很痛,最后舍不得推翻。真正的原型是一个实验:它只有一个任务,就是尽快回答一个你不确定的问题,然后被扔掉。

原型是实验灰盒纸面原型垂直切片什么时候扔

原型的唯一目的

回到第 3 章那张一页纸的最后一栏:「我最不确定能不能做成的是什么?」

原型就是用来回答那一栏的。仅此而已。

◆ 一个原型必须先有一个问题

动手之前,把问题写下来,而且要写成能被「是 / 否」回答的形式:

✗ 不是问题✓ 是问题
「做一个原型看看感觉」「用一个键控制时间倒流,操作起来是清楚的还是混乱的?」
「先把角色移动做出来」「在空中不能转向的情况下,玩家还愿意跳吗?」
「搭个基础框架」「三张牌的组合,能不能在 30 秒内让人看懂?」

没有问题的原型会变成一个无限期的开发过程 —— 因为没有「答完了」这个终点。而有了问题,你就知道什么时候可以停。

砍到最小:什么可以不做

原型的核心技能是识别哪些东西和你的问题无关,然后毫不留情地砍掉。

对于「时间倒流好不好玩」这个问题,下面这些全都无关:

不做用什么代替
美术彩色方块。真的,就是方块
动画没有。或者变个颜色
音效没有(原型期唯一的例外见第 12 章:如果确认反馈是你要验证的东西,那就加)
菜单 / 标题画面直接进游戏
存档没有
多个关卡一个房间
多种敌人一种,甚至零种
代码架构全写在一个文件里,一堆全局变量,随便
◆ 最后一行是认真的

原型阶段不要写好代码

不要建目录结构,不要抽接口,不要考虑扩展性,不要写单元测试。用最快的方式让它跑起来,哪怕是三百行挤在一个 _process 里。

理由有两个:

  1. 你要扔掉它。给要扔的东西写架构是纯粹的浪费。
  2. 好架构会让你不舍得改。当你花了两天设计出一个漂亮的组件系统,你会本能地抗拒那些需要推翻它的想法 —— 而原型阶段恰恰需要你自由地推翻。

写烂代码在这里不是妥协,是正确的工程决定

三种原型,成本递增

一、纸面原型(几小时)

用纸、卡片、骰子、棋子把你的机制模拟一遍。

听起来很土,但对规则类的问题(卡牌、策略、经济、战棋)它快得惊人 —— 你能在一个下午测试二十个数值方案,而写代码可能一个都测不完。

适用:卡牌、桌游式机制、回合制战斗、经济系统、关卡的拓扑结构。

不适用:任何关于手感的问题。纸上模拟不出 0.1 秒的反馈。

二、灰盒原型(几天)

最常用的一种。真的写代码,但所有东西都是色块:

  • 玩家 = 一个矩形
  • 敌人 = 另一个颜色的矩形
  • 地形 = 深灰色矩形
  • 危险 = 红色矩形
  • 目标 = 绿色矩形

颜色本身就是一套约定,而且它足够传递信息。你这本书里看到的所有 demo 就是灰盒原型 —— 它们没有一张图片,但你完全知道发生了什么。

◆ 灰盒的隐藏好处:它让你诚实

没有美术,你就没法用画面掩盖玩法的问题。

一个方块跳来跳去如果让你觉得有意思,那它加上美术之后会更有意思。而如果一个方块跳来跳去很无聊 —— 加美术只会让它变成一个漂亮的无聊。

这是第 12 章那个测试的另一种说法。灰盒原型天然通过了那个测试,因为它本来就什么都没有。

三、垂直切片(几周)

「垂直」的意思是:取游戏的一小块,但把这一块做到成品质量

不是做十个粗糙的关卡,而是把一个关卡做到你打算发布的水平 —— 有美术、有音效、有打磨、有引导。

水平切片(常见错误)垂直切片(正确)
做法把所有系统都做个半成品把一小块做到完整
结果什么都能跑,什么都不好玩一小块,但真的好玩
能回答「技术上可行吗」「这个游戏值不值得做完」
能给别人看吗不能(要解释一堆)

垂直切片的价值在于它是唯一能真正回答「这个游戏好不好」的东西。因为「好玩」是所有层次叠加的结果 —— 手感 + 反馈 + 关卡 + 节奏 + 美术 + 音效。少了任何一层,你测的都不是真实体验。

◆ 垂直切片是你该给别人看的第一个东西

在垂直切片之前,找人测试的价值有限 —— 因为你得一直在旁边解释「这个方块其实是敌人」「这里应该有音效」。玩家的反馈会被这些噪音污染。

垂直切片之后,你可以把它交给一个陌生人,什么都不说,然后看着他玩(第 23 章)。那一刻你会学到你在此之前一整年都学不到的东西。

什么时候扔掉原型

原型有两种结局,两种都是成功:

  1. 答案是「是」 → 你验证了核心假设。现在把原型扔掉,重新写
  2. 答案是「否」 → 你花了三天知道这条路不通,而不是花八个月。这是更值钱的结果。
✕ 第 1 种结局里那个「扔掉」,几乎没人做得到

原型跑通了,你很兴奋,然后你想:「代码是乱了点,但能跑,我在上面继续加吧。」

接下来六个月,你会一直在跟那三百行意大利面搏斗。每加一个功能都要绕开三个 hack,每改一个数值都会弄坏两个别的东西。最后你会在某个凌晨决定重写,那时你已经浪费了远超重写成本的时间。

原型跑通的那一刻,就是重写成本最低的一刻。此时你完全清楚要做什么(原型告诉你了),而代码量最少。

但也不要教条

「扔掉重写」有一个前提:原型确实很脏。

如果你的原型只有两百行、结构还算清楚,那整理一下继续用完全没问题。不要为了仪式感而重写。

判据很实际:你现在能不能在五分钟内说清楚这段代码在干什么?能 → 留着。不能 → 扔。

原型阶段的一个陷阱:过早的美术

这个陷阱值得单独说,因为它伪装得很好。

你做了个灰盒原型,玩起来还行。然后你想:「加点美术看看效果吧。」

于是你花了三天找素材、调色、做动画。做完之后,游戏看起来好多了,你也更有干劲了。

但你现在被套住了。

  • 你不再愿意大改玩法,因为美术是配着当前玩法做的
  • 你对游戏的判断被美术污染了(第 12 章)
  • 你投入了沉没成本,而沉没成本会让人做出更差的决定
◆ 一条建议的时间线
阶段做什么美术
问题原型
3–7 天
回答那一个不确定的问题。色块
玩法原型
2–4 周
核心循环 + 手感 + 3 个关卡。色块
垂直切片
3–6 周
一关做到成品质量开始做,只做这一关需要的
产出期剩下的关卡和内容批量

在「玩法原型」结束之前,一张美术资源都不要做。这条纪律会救你很多次。

最常见的原型失败:验证错了东西

原型跑通了,你很兴奋,然后你做出了错误的结论。这比原型失败更危险,因为你会带着一个假的绿灯往前走半年。

✕ 四种「假绿灯」

一、你验证的是「能不能做出来」,而不是「好不好玩」。

你花三天实现了时间倒流,它工作了,你很有成就感 —— 但那份成就感来自技术实现,不是来自。技术可行性几乎从来不是真问题(几乎什么都能实现),乐趣才是。

二、你自己玩,而你知道所有答案。(第 23 章会展开)你玩自己的解谜原型当然觉得清楚 —— 谜题是你出的。

三、你玩了三分钟,而问题出现在第三十分钟。很多机制前三分钟很新鲜,之后就露馅了。对策:把原型的会话拉长一点,或者连续玩十局看会不会腻。

四、你验证的是新鲜感,不是耐玩度。这是上一条的根源。任何新机制在第一次接触时都有加成,而那个加成会在第二次就消失。

怎么防

  • 把问题写下来(本章第一节),然后测试完回头对照。你回答的是那个问题吗?还是回答了一个更容易的问题?
  • 让别人玩,哪怕只有一个人、哪怕只有五分钟。灰盒原型也可以给人玩 —— 你在旁边说「白方块是你,红方块会杀你」就够了。
  • 连续玩十遍。如果第十遍还想玩,那是真的。如果第三遍就烦了,那前两遍的乐趣是新鲜感。
◆ 一个很实用的判据:你会主动想再玩一次吗

不是「我觉得它挺有意思的」,而是:测试结束之后,你的手有没有下意识地又按了一次开始?

这个身体反应比任何理性评估都准,而且它骗不了人。原型阶段你可以完全信任它 —— 因为此时还没有美术、没有音效、没有任何 juice 来干扰你的判断(第 12 章)。

Godot 里怎么快速搭原型

⚙ 几个让原型跑得更快的做法
  • ColorRectColorRect 就够了。不要建 Sprite、不要找素材。给 CharacterBody2D 挂一个 ColorRect 加一个 CollisionShape2D,两分钟一个角色。
  • 关卡用 TileMapLayer + 一张纯色 tileset。做一张 16×16 的纯色 png,切成一格,就能开始画关卡了。比摆 StaticBody2D 快十倍。
  • 把所有参数挂 @export原型期你会疯狂调数值,能在编辑器里边跑边拖是巨大的效率差异。
  • 加一个重启键。if Input.is_key_pressed(KEY_R): get_tree().reload_current_scene() —— 原型期你一天要重启几百次。
  • 加一个调试叠加层。把速度、状态、是否着地直接画在屏幕上。你会一直需要它。
# 原型期的调试显示,十行,收益极高
extends Label

@export var target: NodePath

func _process(_delta: float) -> void:
	var p := get_node(target)
	text = "vel  %6.1f, %6.1f\nfloor %s\nstate %s\nfps   %d" % [
		p.velocity.x, p.velocity.y,
		p.is_on_floor(), p.get("state_name"),
		Engine.get_frames_per_second(),
	]

本章小结

  • 原型不是「游戏的早期版本」,是一个实验。动手前先把问题写成能被是 / 否回答的形式。
  • 原型阶段不要写好代码。好架构会让你不舍得推翻 —— 而推翻正是原型的目的。
  • 三种原型:纸面(规则类,最快)、灰盒(手感类,最常用)、垂直切片(唯一能回答「值不值得做完」)。
  • 灰盒的隐藏好处:它让你诚实,因为没有美术可以掩盖玩法问题。
  • 原型的两种结局都是成功;「否」甚至更值钱。
  • 原型跑通那一刻,是重写成本最低的一刻。但别教条 —— 判据是「你能不能五分钟说清这段代码」。
  • 玩法原型结束前,一张美术资源都不要做。沉没成本会让你做出更差的决定。
⇄ 换个类型
  • 卡牌 / 战棋 / 策略纸面原型的最佳适用对象。真的去打印一沓卡片,找朋友玩几局。你能在一个周末测完二十个平衡方案,而写代码可能连界面都还没做完。《杀戮尖塔》早期就是纸面测的。
  • 模拟经营:原型该做成一张表格而不是一个游戏。用电子表格模拟一百个游戏日的资源流动(就像第 17 章那个 demo),你能在几小时内发现经济会不会崩。写代码去测经济,是最慢的路。
  • 叙事解谜:原型是文字版。把整个流程写成一份文档,让人读一遍,看他会不会在该困惑的地方困惑、该恍然的地方恍然。谜题的逻辑问题在纸上就能发现,不用等做出来。
  • 平台 / 动作:只能做灰盒,而且要先做手感再做关卡。一个常见错误是先花两周搭关卡编辑器 —— 但如果手感不对,那些关卡全部要重做。
  • 塔防:可以纸面原型(路径和塔的摆放画在方格纸上),但数值必须用表格算(第 14 章那个「DPS 缺口」)。两种原型结合,成本极低。