上一篇文章聊了声音,这篇换个方向:关卡。因为玩家对一款独立游戏的第一印象,八成不是你的代码写得多优雅,而是”我进去之后知不知道该干什么”。
大多数新手关卡的通病不是”不好看”,而是不教人:玩家一进门就面临三个机制、两种敌人、一个跳跃距离极限,死了三次还不知道是自己菜还是设计坑。而成熟的做法很朴素——把关卡当成课程,一段只教一件事,教完立刻考。
今日速览
- TileMapLayer 一层一职责:背景 / 地形碰撞 / 装饰 / 前景遮挡分开画,改起来才不会互相踩。
- TileSet 要存成外部资源:内置在节点里的 TileSet 只能自己用,多关卡复用时一定要 Save 成
.tres。 - tile size 必须在创建 atlas 之前设好:顺序错了,自动切图会按错的格子切,只能删了重来。
- 碰撞 / 导航 / 遮挡都挂在 tile 上:不要在地形旁边散落一堆 StaticBody2D,后期改图会疯。
- 官方明确提醒:TileMap 内置导航在寻路质量和性能上有实际限制,正式关卡建议烘焙成
NavigationRegion2D的导航网格。
一、先把「画关卡」这件事做对
Godot 4 里搭 2D 关卡的基座是 TileMapLayer(旧的 TileMap 节点已拆成多层结构)。官方文档给了三条核心理由:画格子比一个个摆 Sprite2D 快得多、为大量 tile 做了绘制优化、并且能给 tile 挂碰撞/遮挡/导航形状。
实操上我建议固定成四层,命名都带上序号:
00_Background 纯视觉,无碰撞
01_Terrain 有碰撞的地面/墙体(Collision Enabled)
02_Decor 草丛、火把、可破坏物
03_Foreground 前景遮挡(Y Sort Enabled,玩家走到后面被挡住)
几个容易踩的细节:
- TileSet 外置:在 TileMapLayer 的 TileSet 属性下拉里选 Save,存成
res://levels/common_tileset.tres。所有关卡引用同一个文件,改一处全生效。 - 先设尺寸,再拖图:在 TileSet 面板里先填 tile size(比如 64×64),再拖 tilesheet 进面板并选择自动创建。顺序反了就得重做。
- 一层一个 tile:同一格同一层只能放一个 tile,想要”地面 + 上面一株草”就分两层,这正是分层的意义。
- Y 排序:前景层打开 CanvasItem 的 Y Sort,并设置
Y Sort Origin,角色在树后/树前的遮挡才正确。 - 导航别偷懒:原型期可以用 TileMapLayer 的 Navigation 开关,但正式场景用
NavigationRegion2D烘焙,寻路更稳。
二、三拍教学法:一条走廊教会一个机制
一段好的教学段落,长度大概 10~20 秒,结构固定三拍:
| 拍子 | 作用 | 设计要点 | 失败代价 |
|---|---|---|---|
| 引入(Teach) | 在安全环境里展示新元素 | 只有这一个新东西,没有敌人、没有坠落 | 零 |
| 变奏(Vary) | 同一机制换个方向/高度/时机 | 保持元素不变,只改参数 | 极低 |
| 考验(Test) | 组合已有机制,给一点压力 | 加时间压力或一个敌人,不给新机制 | 可承受 |
举个具体例子(平台跳跃 + 冲刺):
- 引入:走廊尽头一个 3 格宽的坑,正常跳跃差 1 格,旁边地上放一块发光的冲刺图标——玩家被迫试一次冲刺。
- 变奏:坑变成 2 格宽但上方有低矮天花板,必须”短冲刺”而不是长按。
- 考验:两个坑连续出现,中间落点有一只巡逻敌人,玩家得先冲刺过坑再立刻处理敌人。
三条铁律:
- 一次只教一个变量。同时教冲刺和蹬墙,玩家会归因错误——他不知道自己刚才是靠哪个动作过的。
- 用空间说话,不用文字。能靠地形暗示的就别弹教程框;实在要提示,用一次性的图标 + 手柄/键盘图标对应。
- 失败了要能立刻重试。检查点放在教学段落起点,重生时间 < 2 秒,玩家的耐心才够用。
三、把「设计意图」写成数据
关卡做崩的根因往往是:你只画了地形,没写”这一段想教什么”。建议每关建一个 levels/level_01.md 的设计表,画图前先填:
段落 1 | 意图:教冲刺 | 玩家应学会:冲刺可跨越 4 格 | 失败代价:掉落即重生 | 时长:15s
段落 2 | 意图:教冲刺取消 | ...
这张表最大的价值是:它可以直接喂给 AI。你不用让 DeepSeek”帮我设计一个好玩的关卡”(它只会给你一堆形容词),而是让它按结构填表、检查漏洞,这才是它能帮上忙的地方。
🎯 DeepSeek 提示词
提示词 1:关卡教学结构表生成器(画图前用)
你是资深关卡设计师,做过 2D 平台动作游戏。请为我设计一关的教学结构。
【我的游戏】2D 横版动作,核心机制:移动、跳跃(二段)、冲刺(有冷却)。
【本关目标】让玩家在 90 秒内掌握「冲刺 + 跳跃」的组合。
【可用元素】静态平台、单向平台、移动平台、巡逻敌人、可破坏箱子、检查点。
【输出格式】Markdown 表格,列固定为:
段落序号 | 类型(引入/变奏/考验) | 教学意图(一句话) | 玩家应学会什么 | 场地要素 | 失败代价 | 预计时长(秒)
【约束】
1. 共 5~7 段,总时长 80~100 秒;
2. 引入段不得出现敌人和坠落伤害;
3. 考验段不得引入任何新机制,只能组合前面已教过的;
4. 每段失败代价必须写明(零/重生/回到检查点);
5. 表格后补 5 行「潜在设计漏洞」,指出可能让玩家误解或卡住的地方。
用法:拿到表格后先照抄成 level_01.md,再打开 Godot 画灰盒。别让 AI 直接给你坐标——坐标是画出来的,不是算出来的。
提示词 2:让 DeepSeek 写关卡加载器(GDScript)
你是 Godot 4.x 的 GDScript 工程师。请写一个关卡加载器脚本。
【任务】读取 JSON 关卡数据,把 tile 绘制到多个 TileMapLayer 上。
【输入】res://levels/level_01.json,结构:
{ "layers": { "Terrain": [ {"x":0,"y":0,"source":0,"atlas_x":3,"atlas_y":1} ] } }
【场景结构】Level 根节点下有 4 个 TileMapLayer 子节点,名字分别为 00_Background、01_Terrain、02_Decor、03_Foreground。
【约束】
1. 使用 Godot 4.3+ 的 TileMapLayer API:set_cell(coords, source_id, atlas_coords, alternative_tile),禁止使用已废弃的 TileMap 节点;
2. 全部变量加类型注解,节点引用用 @onready var x: TileMapLayer = $路径;
3. JSON 读取失败、layer 名不匹配、坐标缺字段时,用 push_error() 报出具体是哪一条,不要静默跳过;
4. 提供 clear_level() 方法,切换关卡前清空所有层;
5. 末尾给 3 行「如何在我的项目里测试」的说明,不要解释基础语法。
用法:AI 给完代码后,先只放 3 个 tile 测试;能画出来再接真实关卡数据。让 AI 一次生成整套系统是 bug 的主要来源。
提示词 3:关卡体检(做完灰盒后自查)
你是挑刺型关卡评审。下面是关卡设计表(我会贴表格)。请只做三件事:
1. 找出「玩家可能卡死或跳过整段」的位置(softlock / sequence break),每条注明段落序号和原因;
2. 找出「视觉引导失效」的地方:玩家在该段是否有明确的下一步方向提示?没有的话给具体改法(放置光源、地标、颜色对比、敌人朝向);
3. 找出「难度跳变」:相邻两段难度差是否过大?给出一个降低或抬高难度的最小改动。
【输出格式】三个小节,每条 1~2 句,必须引用具体段落序号。不要写鼓励性评价,不要总结全文。
用法:灰盒做完先自己跑两遍,再让 AI 按表挑刺。它看不到你的场景,所以它的价值是”结构性找漏”,不是”审美判断”。
学习心得
这两天的内容连起来看有个共同点:音频和关卡都属于”玩家不会夸你、但做砸了一定骂你”的部分。它们不像战斗系统那样能当卖点,却决定了玩家愿不愿意撑过前 10 分钟——而 Steam 的退款窗口恰好就是 2 小时。
对”用 DeepSeek 做一款 Steam 游戏”这个目标来说,今天最有用的一条认知是:AI 擅长结构化产出,不擅长空间判断。让它填教学结构表、写加载器、按表挑刺,它能省你一半时间;让它”设计一个好玩关卡”,它只能还你一嘴空话。把需求拆成表格和约束,才是提示词的真功夫。
明日关注
- 在 Godot 里把四层 TileMapLayer 模板搭好,存成
level_template.tscn复用 - 用提示词 1 生成第一关的 5~7 段结构表,落地成
level_01.md - 画 10 分钟灰盒,只测一件事:不看任何文字提示,能不能自己学会冲刺
本文由自动化学习流水线每日生成,坚持即学即记。
评论