原型:用最丑的方式回答一个问题
大多数人写的不是原型,是「游戏的早期版本」—— 他们从第一天就在写打算保留的代码,于是每一个决定都很沉重,改起来很痛,最后舍不得推翻。真正的原型是一个实验:它只有一个任务,就是尽快回答一个你不确定的问题,然后被扔掉。
原型的唯一目的
回到第 3 章那张一页纸的最后一栏:「我最不确定能不能做成的是什么?」
原型就是用来回答那一栏的。仅此而已。
动手之前,把问题写下来,而且要写成能被「是 / 否」回答的形式:
| ✗ 不是问题 | ✓ 是问题 |
|---|---|
| 「做一个原型看看感觉」 | 「用一个键控制时间倒流,操作起来是清楚的还是混乱的?」 |
| 「先把角色移动做出来」 | 「在空中不能转向的情况下,玩家还愿意跳吗?」 |
| 「搭个基础框架」 | 「三张牌的组合,能不能在 30 秒内让人看懂?」 |
没有问题的原型会变成一个无限期的开发过程 —— 因为没有「答完了」这个终点。而有了问题,你就知道什么时候可以停。
砍到最小:什么可以不做
原型的核心技能是识别哪些东西和你的问题无关,然后毫不留情地砍掉。
对于「时间倒流好不好玩」这个问题,下面这些全都无关:
| 不做 | 用什么代替 |
|---|---|
| 美术 | 彩色方块。真的,就是方块 |
| 动画 | 没有。或者变个颜色 |
| 音效 | 没有(原型期唯一的例外见第 12 章:如果确认反馈是你要验证的东西,那就加) |
| 菜单 / 标题画面 | 直接进游戏 |
| 存档 | 没有 |
| 多个关卡 | 一个房间 |
| 多种敌人 | 一种,甚至零种 |
| 代码架构 | 全写在一个文件里,一堆全局变量,随便 |
原型阶段不要写好代码。
不要建目录结构,不要抽接口,不要考虑扩展性,不要写单元测试。用最快的方式让它跑起来,哪怕是三百行挤在一个 _process 里。
理由有两个:
- 你要扔掉它。给要扔的东西写架构是纯粹的浪费。
- 好架构会让你不舍得改。当你花了两天设计出一个漂亮的组件系统,你会本能地抗拒那些需要推翻它的想法 —— 而原型阶段恰恰需要你自由地推翻。
写烂代码在这里不是妥协,是正确的工程决定。
三种原型,成本递增
一、纸面原型(几小时)
用纸、卡片、骰子、棋子把你的机制模拟一遍。
听起来很土,但对规则类的问题(卡牌、策略、经济、战棋)它快得惊人 —— 你能在一个下午测试二十个数值方案,而写代码可能一个都测不完。
适用:卡牌、桌游式机制、回合制战斗、经济系统、关卡的拓扑结构。
不适用:任何关于手感的问题。纸上模拟不出 0.1 秒的反馈。
二、灰盒原型(几天)
最常用的一种。真的写代码,但所有东西都是色块:
- 玩家 = 一个矩形
- 敌人 = 另一个颜色的矩形
- 地形 = 深灰色矩形
- 危险 = 红色矩形
- 目标 = 绿色矩形
颜色本身就是一套约定,而且它足够传递信息。你这本书里看到的所有 demo 就是灰盒原型 —— 它们没有一张图片,但你完全知道发生了什么。
没有美术,你就没法用画面掩盖玩法的问题。
一个方块跳来跳去如果让你觉得有意思,那它加上美术之后会更有意思。而如果一个方块跳来跳去很无聊 —— 加美术只会让它变成一个漂亮的无聊。
这是第 12 章那个测试的另一种说法。灰盒原型天然通过了那个测试,因为它本来就什么都没有。
三、垂直切片(几周)
「垂直」的意思是:取游戏的一小块,但把这一块做到成品质量。
不是做十个粗糙的关卡,而是把一个关卡做到你打算发布的水平 —— 有美术、有音效、有打磨、有引导。
| 水平切片(常见错误) | 垂直切片(正确) | |
|---|---|---|
| 做法 | 把所有系统都做个半成品 | 把一小块做到完整 |
| 结果 | 什么都能跑,什么都不好玩 | 一小块,但真的好玩 |
| 能回答 | 「技术上可行吗」 | 「这个游戏值不值得做完」 |
| 能给别人看吗 | 不能(要解释一堆) | 能 |
垂直切片的价值在于它是唯一能真正回答「这个游戏好不好」的东西。因为「好玩」是所有层次叠加的结果 —— 手感 + 反馈 + 关卡 + 节奏 + 美术 + 音效。少了任何一层,你测的都不是真实体验。
在垂直切片之前,找人测试的价值有限 —— 因为你得一直在旁边解释「这个方块其实是敌人」「这里应该有音效」。玩家的反馈会被这些噪音污染。
垂直切片之后,你可以把它交给一个陌生人,什么都不说,然后看着他玩(第 23 章)。那一刻你会学到你在此之前一整年都学不到的东西。
什么时候扔掉原型
原型有两种结局,两种都是成功:
- 答案是「是」 → 你验证了核心假设。现在把原型扔掉,重新写。
- 答案是「否」 → 你花了三天知道这条路不通,而不是花八个月。这是更值钱的结果。
原型跑通了,你很兴奋,然后你想:「代码是乱了点,但能跑,我在上面继续加吧。」
接下来六个月,你会一直在跟那三百行意大利面搏斗。每加一个功能都要绕开三个 hack,每改一个数值都会弄坏两个别的东西。最后你会在某个凌晨决定重写,那时你已经浪费了远超重写成本的时间。
原型跑通的那一刻,就是重写成本最低的一刻。此时你完全清楚要做什么(原型告诉你了),而代码量最少。
但也不要教条
「扔掉重写」有一个前提:原型确实很脏。
如果你的原型只有两百行、结构还算清楚,那整理一下继续用完全没问题。不要为了仪式感而重写。
判据很实际:你现在能不能在五分钟内说清楚这段代码在干什么?能 → 留着。不能 → 扔。
原型阶段的一个陷阱:过早的美术
这个陷阱值得单独说,因为它伪装得很好。
你做了个灰盒原型,玩起来还行。然后你想:「加点美术看看效果吧。」
于是你花了三天找素材、调色、做动画。做完之后,游戏看起来好多了,你也更有干劲了。
但你现在被套住了。
- 你不再愿意大改玩法,因为美术是配着当前玩法做的
- 你对游戏的判断被美术污染了(第 12 章)
- 你投入了沉没成本,而沉没成本会让人做出更差的决定
| 阶段 | 做什么 | 美术 |
|---|---|---|
| 问题原型 3–7 天 | 回答那一个不确定的问题 | 零。色块 |
| 玩法原型 2–4 周 | 核心循环 + 手感 + 3 个关卡 | 零。色块 |
| 垂直切片 3–6 周 | 一关做到成品质量 | 开始做,只做这一关需要的 |
| 产出期 | 剩下的关卡和内容 | 批量 |
在「玩法原型」结束之前,一张美术资源都不要做。这条纪律会救你很多次。
最常见的原型失败:验证错了东西
原型跑通了,你很兴奋,然后你做出了错误的结论。这比原型失败更危险,因为你会带着一个假的绿灯往前走半年。
一、你验证的是「能不能做出来」,而不是「好不好玩」。
你花三天实现了时间倒流,它工作了,你很有成就感 —— 但那份成就感来自技术实现,不是来自玩。技术可行性几乎从来不是真问题(几乎什么都能实现),乐趣才是。
二、你自己玩,而你知道所有答案。(第 23 章会展开)你玩自己的解谜原型当然觉得清楚 —— 谜题是你出的。
三、你玩了三分钟,而问题出现在第三十分钟。很多机制前三分钟很新鲜,之后就露馅了。对策:把原型的会话拉长一点,或者连续玩十局看会不会腻。
四、你验证的是新鲜感,不是耐玩度。这是上一条的根源。任何新机制在第一次接触时都有加成,而那个加成会在第二次就消失。
怎么防
- 把问题写下来(本章第一节),然后测试完回头对照。你回答的是那个问题吗?还是回答了一个更容易的问题?
- 让别人玩,哪怕只有一个人、哪怕只有五分钟。灰盒原型也可以给人玩 —— 你在旁边说「白方块是你,红方块会杀你」就够了。
- 连续玩十遍。如果第十遍还想玩,那是真的。如果第三遍就烦了,那前两遍的乐趣是新鲜感。
不是「我觉得它挺有意思的」,而是:测试结束之后,你的手有没有下意识地又按了一次开始?
这个身体反应比任何理性评估都准,而且它骗不了人。原型阶段你可以完全信任它 —— 因为此时还没有美术、没有音效、没有任何 juice 来干扰你的判断(第 12 章)。
Godot 里怎么快速搭原型
- 用
ColorRect和ColorRect就够了。不要建 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 缺口」)。两种原型结合,成本极低。