今日速览
- 瓦片地图(TileMap) = 把关卡画在网格上:一个格子一块瓦片,比手动摆 Sprite2D 节点快一个数量级,还专为大关卡做了绘制优化。
- Godot 4.3+ 把旧版
TileMap节点改名为TileMapLayer,一个节点一层地图,前景/背景/碰撞层分开管理。 - 瓦片不只是图片:每个瓦片可以内嵌碰撞形状、遮挡形状(Occluder)、导航区域,画完地图就等于画完了物理世界。
- 官方建议:多关卡复用的 TileSet 要存成外部资源(.tres),而不是内嵌在节点里。
- 性能与导航红线:靠
Rendering Quadrant Size控制绘制分组;敌人寻路别用瓦片内置导航,应烘培成 NavigationRegion2D。
核心学习内容
一、为什么 2D 关卡都要用瓦片地图
想象一个 100×50 的关卡:如果用 Sprite2D 摆地面和墙壁,需要几千个节点,场景树爆炸、编辑痛苦、性能堪忧。瓦片地图把这一切变成「在网格上刷油漆」:选中瓦片 → 点击/拖拽 → 关卡就画出来了。而且所有瓦片由引擎按「象限」(Quadrant)合批绘制,几千块瓦片也只占几个 CanvasItem,性能远超节点堆砌。这是平台跳跃、俯视角 RPG、地牢类游戏的地基工具。
二、搭建流程:TileSet → TileMapLayer → 分层与碰撞
- 先建 TileSet:导入瓦片图集(如 16×16 或 32×32 的图集),在 TileSet 编辑器里自动切分瓦片,并给「土地」「墙壁」等瓦片手动添加碰撞多边形(Collision Polygon)。
- TileMapLayer 挂 TileSet:新建 TileMapLayer 节点,把 TileSet 拖进去。若是多关卡复用,记得把 TileSet Save 成外部资源,每个关卡场景共用同一份。
- 多层规划:官方明确建议按需分层——背景层(装饰)、地面层(可走)、碰撞层或前景层(遮挡)。同坐标可以叠多层瓦片,前景瓦片可实现「角色走到树后」的效果(配合 Y Sort Origin 做 Y 排序)。
- 检查物理开关:每层有
Collision Enabled(默认开)、Use Kinematic Bodies(需要瓦片推动/移动时才开)等选项;导航类瓦片需在 TileSet 里加 Navigation Polygon,并在层上开Navigation Enabled。
三、绘制工具速查(TileMap 面板)
选中最下面的 TileMap 面板,工具栏从左到右:选择(框选/Shift 加选/Ctrl 减选,Ctrl+C/V 复制粘贴整块地形)、画笔(左键画右键擦,Shift 画直线、Ctrl+Shift 画矩形)、直线、矩形、油漆桶(默认 Contiguous 连续填充,只填连通区域;取消勾选则全图替换)、取色器(Ctrl 点按吸取已有瓦片)、橡皮擦。还有两个实用开关:随机化(在多个选中瓦片间随机取一个)和散射 Scattering(有概率留空),刷草地碎石特别自然。预制图案(Pattern)可以存下来跨关卡复用。
四、脚本控制:程序化生成与坐标换算
瓦片地图不只是手绘工具,也支持代码操作,适合程序化生成关卡:
# 常用 API 速记
$Ground.set_cell(coords, source_id, atlas_coords, alternative) # 放一块瓦片
$Ground.erase_cell(coords) # 抹掉一块
$Ground.get_cell_source_id(coords) # 查询该格是哪种瓦片
var used: Array = $Ground.get_used_cells() # 所有非空格子(遍历关卡)
var map_pos: Vector2i = $Ground.local_to_map(global_position) # 世界坐标 → 格子坐标
var world_pos: Vector2 = $Ground.map_to_local(map_pos) # 格子坐标 → 世界坐标
判断「角色踩在什么地上」「敌人下一步往哪格走」都靠 local_to_map 这组换算。注意官方警告:2D 导航网格不能多层叠加,做寻路时把瓦片导航烘培成 NavigationRegion2D 更稳更快。
🎯 DeepSeek 提示词
提示词 1:把设计草图变成瓦片地图代码(程序化生成关卡)
适用场景:关卡设计定了,想快速生成一个可运行的 Godot 关卡,而不是手动一格一格画。
你是资深 Godot 4 游戏开发者。请用 GDScript 写一个程序化生成 2D 平台关卡的脚本。
需求:
- 使用 TileMapLayer 节点(变量名 $Level),TileSet 已配置好,源 ID 为 0;
- 图集中「地面」瓦片坐标为 (2, 0),「砖块」瓦片坐标为 (3, 0);
- 用 seed 随机生成一条 80 格宽的地面,地面高度在 y=10 附近随机起伏,并在随机位置放 3-5 组砖块平台;
- 生成后用 print 输出实际生成的格子数量。
输出要求:
- 给出完整可直接粘贴到 Godot 4 的 GDScript 脚本;
- 关键行加中文注释;
- 最后用 3 句话说明如何把这个脚本挂到场景上运行。
提示词 2:用字符画设计关卡,让 DeepSeek 转成地图数据
适用场景:用记事本/表格就能设计关卡,再让 AI 转成瓦片坐标数组,编辑器里一键重建或运行时加载。
你是 Godot 4 瓦片地图专家。下面是一个 10 行 × 20 列的关卡字符画:
####################
#..........P.......#
#..B......B........#
#..................
#..####......####..#
#..................
#....E.............#
####################
规则:#=墙壁,.=空地,P=玩家出生点,B=砖块平台,E=敌人出生点。
请输出:
1. 一个 GDScript 字典或数组,把字符画转成瓦片坐标(Vector2i)列表,按类型分组(walls/platforms/spawns/enemies),使用 TileMapLayer.set_cell() 的格式;
2. 写一个 parse_level(ascii_map: String) -> Dictionary 函数,输入字符画字符串直接生成地图;
3. 指出字符画转地图时最容易踩的坑(如行列与 x/y 轴对应关系),并用注释标在代码里。
提示词 3:瓦片地图碰撞排查
适用场景:角色掉出地图、卡进墙壁、或者瓦片碰撞没生效时,让 AI 帮你定位问题。
你是 Godot 4 物理与瓦片地图调试专家。我的 2D 平台游戏出现以下问题:角色可以穿过部分墙壁瓦片,且站在地面瓦片上会微微抖动。
请按顺序排查并给出修复方案:
1. 检查 TileSet 中哪些瓦片缺少碰撞多边形(Collision Polygon2D),以及「地形」自动拼接瓦片(Terrain)的碰撞形状是否跟随了旋转/翻转;
2. 检查 CharacterBody2D 的移动代码是否每帧先 move_and_slide() 再更新位置,速度是否超过瓦片尺寸导致隧穿;
3. 检查碰撞层(layer/mask)配置是否把角色和地图放在了同一层;
4. 输出一份带注释的检查清单(Checklist)和修改后的关键代码片段。
学习心得
对「用 DeepSeek 做一款能上架的 Steam 游戏」来说,瓦片地图是必须拿下的技术高地:它同时解决关卡搭建效率、物理碰撞、性能优化三件事,是 2D 游戏的「地基」。今天的三个提示词正好覆盖「生成关卡 → 转换设计 → 排查碰撞」的完整链路——手绘关卡用编辑器,批量/程序化关卡交给 DeepSeek 生成脚本,出 bug 再让 DeepSeek 当调试员。这样即使不熟 GDScript 细节,也能把关卡管线跑起来。下一步等游戏有第一个可玩关卡后,就能开始打磨手感、做 UI、接 Steamworks 了。
明日关注
- 把 TileSet 存成外部资源,并规划好背景/地面/前景三层结构,动手做第一个 20×20 测试关卡
- 用提示词 2 的字符画法设计一个 5 分钟的迷你关卡,跑通「字符画 → set_cell → 可玩」流程
- 记录角色碰到瓦片时的碰撞问题,用提示词 3 的清单排查一遍
本文由自动化学习流水线每日生成,坚持即学即记。
评论