卷 II · 玩CH 05深度 05/24

核心循环:三十秒里发生了什么

你做了一个跳跃手感很好的小人,自己玩了五分钟,然后……不想玩了。这不是手感的问题,是你只做出了三个循环里的第一个。一款留得住人的游戏,同时有三个齿轮在转:一个转 3 秒、一个转 3 分钟、一个转 3 小时。这一章教你把它们分别画出来,并诊断自己的游戏断在哪一环。

三层循环闭合会话长度诊断法

为什么「玩五分钟就腻」

这是个人开发者最常撞上的墙,而且它出现得很早 —— 通常就在你第一个原型能跑起来之后的第三天。

你的角色跳起来很舒服,落地有烟尘,踩到敌人有顿帧。你自己试了几十次,越试越满意。然后你把它发给朋友,朋友玩了两分钟说「挺好的」,然后放下手机。

你会本能地归因到「内容不够」,于是去做更多关卡。但那通常治不好这个病。

◆ 真正的病因

玩家继续玩下去,需要在每个时间尺度上都有一个理由:

  • 为什么要再按一次?(3 秒)—— 你做到了,手感好就够了
  • 为什么要玩完这一关 / 这一局?(3 分钟)—— 通常缺这个
  • 为什么明天还要打开它?(3 小时以上)—— 几乎肯定缺这个

三个问题必须各自有答案。第一个的答案救不了第二个 —— 「因为跳起来很舒服」不构成「所以我要玩完这一关」的理由。

下面这个 demo 把四款很不一样的游戏的三层循环并排放出来。换着看几款,注意每一款的三层各自兑现了什么

第一层:核心循环(约 3 秒)

玩家重复得最频繁的那个动作,加上它的即时反馈。

看到情况 → 做决定 → 执行动作 → 立刻看到结果 → 回到第一步

这一层的要求只有一条,但很硬:结果必须立刻可见。

「立刻」的量级是几十到几百毫秒。超过 200 毫秒,玩家的大脑就开始怀疑「我刚才那下有没有生效」;超过 500 毫秒,因果关系在感知上就断了。

◆ 核心循环的时长决定了游戏的性格
核心循环时长玩家状态典型
0.2–1 秒肌肉记忆,几乎不思考平台跳跃、射击、音游
2–5 秒快速权衡,有思考但不深卡牌出牌、塔防放置
10–60 秒真正的规划战棋一回合、经营一次决策
> 2 分钟危险区需要额外的小反馈填充

核心循环越长,你越需要在中间塞小反馈。这就是为什么回合制游戏里,即使一回合要想两分钟,每一次点击也都有音效和高亮 —— 那些是给中间那段空白垫的。

核心循环的常见毛病:反馈没有信息

很多人的核心循环有反馈,但反馈里没有信息。

比如你打敌人,敌人闪一下白光。这是反馈,但它只告诉玩家「打中了」。而玩家真正想知道的是:我打得好不好?离打死还有多远?我该继续这样打还是换个方式?

改法:让反馈的强度随情况变化 —— 打到弱点的顿帧更长、血量低于三成时敌人的受击表现不同、连击时数字变大变红。反馈的差异,就是玩家学习的材料。

第二层:会话循环(约 3 分钟到 30 分钟)

「一局」「一关」「一天」—— 玩家一次坐下来能完成的最小完整单元。

开始 → 一连串核心循环 → 结算 → 得到点什么 → 决定要不要再来一次

这一层是个人项目最常缺失的一层,也是最容易补上的一层。

◆ 会话循环必须提供两样东西
  1. 一个明确的结束。玩家必须知道「这一局结束了」。没有结束就没有成就感 —— 这是为什么无尽模式反而不如有关卡的版本让人上瘾。
  2. 一样带得走的东西。可以是:解锁、分数记录、一张新卡、下一关、一段剧情、甚至只是一句「你用了 47 秒,上次是 52 秒」。

第 2 条里最便宜、最被低估的是最好成绩。一行代码,立刻把「随便玩玩」变成「我要打破自己的记录」。

会话长度是一个设计决定,不是自然结果

很多人让会话长度「自然发生」—— 关卡做多长就多长。这是在放弃一个很有力的杠杆。

会话长度它带来什么它要求什么
1–3 分钟「再来一局」的成瘾性最强,失败几乎无成本核心循环必须极其耐玩,因为重复度极高
10–20 分钟能容纳一个小的起承转合,有节奏感中途要有存档点,否则失败太贵
30–60 分钟能做出真正的构筑和策略演化必须允许中途退出,否则玩家不敢开始
> 2 小时史诗感需要非常强的存档与进度反馈,个人项目慎选

对第一个游戏,强烈建议 1–3 分钟。理由:它把你的调试成本降到最低。你每改一个数值,就能在两分钟内完整验证一遍 —— 而如果一局要 40 分钟,你一天只能试十次。

第三层:元循环(数小时到数十小时)

跨越多次会话的那条线。玩家关掉游戏之后,是什么让他明天还想打开?

多次会话 → 积累 → 解锁 / 变强 / 看到新东西 → 有了新的目标 → 继续

元循环的本质是「给玩家一个明天」。它的形态很多:

  • 解锁:打通第 3 关解锁一个新角色(最便宜,效果最好)
  • 永久成长:肉鸽的元升级
  • 掌握:纯技巧游戏,你自己在变强(《蔚蓝》《只狼》靠这个)
  • 收集:图鉴、成就、稀有掉落
  • 叙事:想知道后面发生什么
  • 建造:你的农场 / 基地在变好(星露谷、缺氧)
◆ 第一个游戏的元循环该做什么

答案:解锁 + 最好成绩。

理由是成本。永久成长要做数值系统,收集要做美术资产,叙事要写字。而「通关第 3 关解锁一个新皮肤 / 新起始道具」可能只要半天,却能实打实地把留存拉起来。

更省的做法:把关卡本身当解锁。「下一关我还没见过」本身就是一个合法的元循环 —— 前提是关卡之间真的有变化(第 16 章讲怎么做出这种变化)。

诊断:你的游戏断在哪一层

这是本章最实用的部分。把你的游戏对着下面这张表过一遍。

玩家的反应断在哪怎么修
「操作起来别扭 / 不跟手」 核心循环 卷 III 整整五章都在修这个
「挺好玩的,但我玩两分钟就放下了」 会话循环 加一个明确的结束 + 一样带得走的东西。先试最好成绩
「我通关了,挺好的」然后再也没打开 元循环 加解锁;或者接受它 —— 15 分钟的游戏本来就不需要元循环
「玩了很久,但说不上为什么」 元循环过强而核心循环弱 危险信号。玩家在被数字牵着走,不是在享受。见下
「每一局都一样」 会话循环没有变化 不是加内容,是加变量(第 15、16 章)
✕ 第四行那种情况

「玩了很久但说不上为什么」是一个需要警惕的成功

它意味着你的元循环(进度条、数字、解锁)在推着玩家走,而核心循环本身并不有趣。这种游戏能骗到时长,但骗不到口碑 —— 玩家事后回想会有一种被浪费了的感觉,然后给你一个差评说「空洞」。

检验方法:把所有的解锁、数字、进度全部关掉,让玩家裸玩五分钟。还有意思吗?没有的话,你造的是一台老虎机,不是一个游戏。

怎么画出自己游戏的三层循环

一个十五分钟的练习,建议现在就做。拿张纸,画三个圈,每个圈填四个格子:

【核心循环】时长约 ______ 秒
  玩家看到什么 →
  他做什么决定 →
  他执行什么动作 →
  他立刻得到什么反馈 →(回到第一步)

【会话循环】时长约 ______ 分钟
  一局怎么开始 →
  中间是一串什么 →
  怎么结束(明确吗?)→
  他带走了什么 →(他为什么要再来一局)

【元循环】时长约 ______ 小时
  跨局积累的是什么 →
  积累到什么程度会解锁 →
  解锁改变了什么 →
  他现在的新目标是什么 →
◆ 填不出来的格子,就是你的问题清单

大多数人第一次做这个练习,会发现:

  • 核心循环的四格填得飞快 —— 你在这上面想得最多
  • 会话循环的「怎么结束」「带走了什么」填不出来
  • 元循环整个是空的

这不是失败,这是诊断结果。你现在知道该往哪儿投入了 —— 而且知道自己不该再去优化那个已经很好的核心循环。

一个常被忽略的格子:「他为什么要再来一局」

这一格最能暴露问题,因为它逼你从玩家的角度想一件很残酷的事:这一局结束的那一刻,他有什么理由不去关掉游戏?

可接受的答案:

  • 「我差一点就打破记录了」(最好成绩)
  • 「我想试试用另一套打法」(构筑 / 选择)
  • 「下一关我还没见过」(内容)
  • 「我刚解锁了新东西还没用过」(解锁)
  • 「我刚才那个操作差一点就成了」(掌握)

不可接受的答案:「因为它好玩」—— 那不是理由,那是你的希望。

三层之间的关系:越往外,兑现越慢,也越需要被承诺

还有一个常被忽略的点:外层循环的奖励是延迟的,所以你必须提前承诺它。

玩家在第 3 分钟不知道第 30 分钟有什么,他就没有理由撑到第 30 分钟。所以你要在早期就让他看见未来

  • 解锁列表里有一堆灰色的格子 —— 玩家立刻知道还有多少东西没拿到
  • 地图上有一扇现在打不开的门 —— 玩家记住了它
  • 能力列表里有一栏写着「???」
  • 关卡选择界面显示还有 8 关

这些不是 UI 装饰,它们是元循环的可见部分。元循环如果不可见,它就不存在 —— 因为玩家没法为一个他不知道的东西坚持。

⚙ Godot 落地:三层循环 = 三个场景层级

三层循环在工程上通常对应三个层级的节点,早点分清楚会省很多事:

# 元循环:跨会话的持久状态,autoload 单例
# Project Settings → Autoload 里注册成 GameState
extends Node

var unlocked_levels: int = 1
var best_times: Dictionary = {}      # { "level_1": 47.2 }

func record_time(level: String, t: float) -> void:
	if not best_times.has(level) or t < best_times[level]:
		best_times[level] = t
		save()                        # 一局结束就存,别等退出

func save() -> void:
	var f := FileAccess.open("user://save.json", FileAccess.WRITE)
	f.store_string(JSON.stringify({
		"unlocked": unlocked_levels,
		"best": best_times,
	}))
# 会话循环:一关一个场景,负责「开始 → 结算」
extends Node2D

var elapsed: float = 0.0

func _process(delta: float) -> void:
	elapsed += delta

func _on_goal_reached() -> void:
	GameState.record_time(scene_file_path, elapsed)
	GameState.unlocked_levels = maxi(GameState.unlocked_levels, level_index + 1)
	show_results(elapsed)             # 明确的结束 + 带得走的东西

核心循环就是上一章那个 CharacterBody2D

关键点:元循环的状态必须活在 autoload 里(跨场景存活),会话状态活在关卡场景里(切换即销毁)。混在一起是新手最常见的架构错误,表现为「重开关卡后数据莫名其妙还在 / 莫名其妙没了」。

本章小结

  • 三个循环同时在转:3 秒(核心)/ 3 分钟(会话)/ 3 小时(元),每一层都要独立回答「为什么继续」。
  • 核心循环的铁律:结果必须在 200 毫秒内可见,且反馈里要带信息,不只是「打中了」。
  • 会话循环必须有明确的结束 + 一样带得走的东西。最便宜的是最好成绩。
  • 元循环 = 给玩家一个明天,而且必须提前可见(灰色的格子、打不开的门)。
  • 第一个游戏:会话 1–3 分钟,元循环用「解锁 + 最好成绩」,不要做永久成长系统。
  • 警惕「玩了很久但说不上为什么」—— 那是元循环在替核心循环撑场子。
⇄ 换个类型
  • 卡牌 / 肉鸽:三层最清楚的类型。出一张牌(3 秒)→ 打完一场战斗拿一张卡(3 分钟)→ 爬完一次塔解锁新卡(1 小时)。它的秘密在于三层都有「获得」 —— 三层的奖励类型还各不相同(伤害数字 / 新卡 / 新解锁)。
  • 塔防:核心是放置(3 秒),会话是一波敌人(1 分钟)—— 注意塔防有个额外的第 2.5 层:一整关的波次。这一层是它节奏感的来源。
  • 模拟经营:核心循环往往很弱(点一下、等)。它靠会话层(一天 / 一季)和元层(农场变样)撑着。这类游戏最需要「提前可见」 —— 星露谷第一天就让你看见破败的社区中心,那是一张巨大的待办清单。
  • 叙事解谜:核心循环是「观察 → 尝试 → 反馈」,会话是一个谜题,元是剧情推进。最大风险是核心层反馈太弱:玩家试错时如果得不到「你离对的更近了」的信号,就会退化成穷举点击。
  • 纯技巧动作(蔚蓝、只狼):元循环可以完全是「玩家自己变强」,不需要任何解锁系统 —— 但代价是核心循环必须极其精良,因为没有任何外部奖励替它遮丑。这条路最纯粹,也最难。