Godot 4 TileMapLayer 入门:从图集、碰撞到可玩的 2D 关卡

OK,OK,大家好,欢迎大家来到大鹏 AI 教育,我是张大鹏。

第一次做 2D 关卡,最容易走的弯路是把每一块地砖都当作独立图片摆进场景。十几块还能忍,几百块以后,场景树、碰撞和修改成本都会迅速失控。

这篇文章只完成一个目标:把一张地砖图集变成可绘制、可碰撞、可运行验证的 TileMapLayer 关卡。

TileMapLayer 到底解决什么

一张图集里通常包含草地、墙面、拐角、装饰等小图块。TileSet 负责描述"有哪些地块以及它们具有什么属性",TileMapLayer 负责回答"这些地块画在场景的哪些格子里"。

可以把工作流记成:

  • 🖼️ 导入地砖图集
  • ✂️ 按统一尺寸切分图块
  • 🧱 为需要阻挡角色的图块配置碰撞
  • 🖌️ 在 TileMapLayer 网格上绘制关卡
  • 🎮 运行并用角色验证结果

第一步:创建 TileMapLayer 和 TileSet

在场景中添加 TileMapLayer,然后在检查器中新建 TileSet 资源。

这里有两个尺寸必须分清:

  • 📐 图块尺寸:图集中每个小格的像素宽高
  • 🗺️ 场景网格:地块在地图中的排列单位

如果原图每块是 16×16,而 TileSet 配成 32×32,自动切分一定会错位。先确认素材尺寸,再填写 TileSet 的 Tile Size。

第二步:把图集切成可选地块

把地砖图片拖进 TileSet 面板,创建 Atlas Source。Godot 会按照 Tile Size 在原图上显示切分网格。

检查切分是否正确时,不要只看第一行。尤其要观察边缘地块、拐角地块和带透明区域的装饰物,确认网格线没有穿过有效像素。

如果切分错位,优先检查:

  • 🔍 原图是否真的使用统一网格
  • 🔍 Tile Size 是否与素材一致
  • 🔍 图集是否存在边距或地块间隔
  • 🔍 导入设置是否改变了素材尺寸

第三步:碰撞属于地块,不属于整张图

关卡"看起来有墙"并不代表角色会被挡住。我们还要在 TileSet 中创建物理层,然后为需要阻挡角色的地块绘制碰撞多边形。

推荐从最简单的矩形地块开始。碰撞轮廓只覆盖实体部分,草尖、阴影、透明留白通常不应算作阻挡区域。

斜坡和不规则石块可以使用多边形,但顶点越多并不一定越准确。过度复杂的碰撞形状会增加维护成本,也可能让角色移动产生细碎卡顿。

第四步:像画画一样搭建地图

完成 TileSet 后,回到 TileMapLayer 的绘制模式,从调色板选择地块,在视口网格上绘制。

我通常按下面的顺序搭建:

  • 🧱 先画决定路线的墙体和地面
  • 🚪 再留出出生点、出口和关键通道
  • 🌳 然后补充树木、石头等大型装饰
  • ✨ 最后添加小型装饰,打破重复感

一开始不要急着把地图画满。先做一条可以从起点走到终点的短路线,运行验证后再扩展。

用多个 TileMapLayer 管理层次

一个完整关卡通常不只有一层。可以按职责拆分:

  • 🌱 Ground:地面,通常不阻挡角色
  • 🧱 Walls:墙体和主要碰撞
  • 🌿 DecorationBelow:角色下方装饰
  • 🌳 DecorationAbove:遮挡角色的前景

拆层的价值不只是视觉排序。你可以单独隐藏、锁定、调整或替换某一类内容,不必在同一层里小心挑选。

一个更实用的验收方式

不要只在编辑器里看地图。把上一篇的 CharacterBody2D 角色放进场景,实际走一圈:

  • 🎮 能否从出生点到达目标点
  • 🧱 墙角会不会卡住
  • 🚧 看似封闭的位置是否漏了碰撞
  • 🕳️ 看似可走的位置是否被透明碰撞挡住
  • 👀 前景层是否正确遮挡角色

关卡编辑的"完成"不是画面好看,而是画面、碰撞和玩法一致。

最容易踩的五个坑

  • ❌ 使用旧教程里的 TileMap 操作照搬到新版

    ✅ 新项目优先使用 TileMapLayer,每一层职责更明确。

  • ❌ Tile Size 与原图单格尺寸不同

    ✅ 先确认素材规格,再创建 Atlas。

  • ❌ 所有地块都画碰撞

    ✅ 只为真正阻挡角色的实体地块配置。

  • ❌ 装饰和墙体混在同一层

    ✅ 按地面、墙体、前景和背景拆层。

  • ❌ 画完整张地图后才运行

    ✅ 每完成一小段可玩路线就测试一次。

验收清单

  • ✅ 图集切分没有错位
  • ✅ 地块尺寸与地图网格一致
  • ✅ 墙体地块具有正确碰撞
  • ✅ 地面和非实体装饰不会误挡角色
  • ✅ 地图至少存在一条完整可玩路线
  • ✅ 多层绘制的遮挡关系正确
  • ✅ 角色实际跑图时没有穿墙和卡角

小结

TileMapLayer 的重点不在"把图块画出来",而在建立一条稳定的关卡生产链:TileSet 管理地块定义,Atlas 管理图集切分,物理层管理碰撞,多个 TileMapLayer 管理地图职责。

你做 TileMapLayer 时最容易卡在哪一步:图集切分、碰撞配置,还是多层遮挡?欢迎把具体问题发到评论区。

参考资料

相关推荐
Python私教7 小时前
Godot图片怎么导入?PNG、压缩、Mipmap与Reimport一次讲清
游戏引擎·godot
Python私教8 小时前
Blender模型导入Godot完整教程:GLB、BLEND与继承场景怎么选
运维·godot·blender
寒水馨8 小时前
Linux下载、安装godot-4.7.1-stable(附安装包Godot_v4.7.1-stable_linux.x86_64.zip)
linux·游戏引擎·godot·游戏开发·2d游戏·3d游戏·godot engine
寒水馨11 小时前
macOS下载、安装godot-4.7.1-stable(附安装包Godot_v4.7.1-stable_macos.universal.zip)
macos·3d·游戏引擎·godot·跨平台·游戏开发·2d
Python私教1 天前
Godot怎么下载和安装?零基础完成第一次启动
人工智能·游戏·godot
Python私教6 天前
我用 AI 做出了第一个 Godot 贪吃蛇
人工智能·游戏引擎·godot
郝学胜-神的一滴9 天前
中级OpenGL教程 020:巧用数组与循环实现多点点光源渲染,告别冗余代码重构方案
c++·unity·游戏引擎·godot·图形渲染·unreal
KillJUMP14 天前
SDF函数
godot·着色器
松树戈16 天前
【Godot4精进之路】03~Godot编辑器常用界面介绍
编辑器·游戏引擎·godot