做 2D 游戏,关卡编辑器是必需品。
Tiled 是老牌方案,功能全,但界面过时、JSON 导出格式繁琐、集成要写一堆代码,每次换项目都要重新适配。
LDtk(Level Designer Toolkit)是为现代 2D 游戏重新设计的关卡编辑器——由《Celeste》主程 Maddy Thorson 开发,专门针对独立游戏工作流优化。
为什么 LDtk 是更好的选择
和 Tiled 的核心对比
| 特性 | Tiled | LDtk |
|---|---|---|
| 界面设计 | Qt 传统风格 | 现代极简界面 |
| 层级结构 | 图层(Tileset/Layer) | 自定义层级(Levels/Layers) |
| 数据格式 | JSON/XML(自定义) | JSON(自动生成) |
| 集成难度 | 需要解析自定义格式 | 官方支持多引擎 |
| 自动图块(Autotile) | 手动配置 | 原生支持 |
| 实体系统(Entities) | 无 | 原生实体系统 |
| 团队协作 | 无 | 多用户实时协作 |
LDtk 的核心优势
自定义层级结构:LDtk 不强制使用 tileset/layer 的固定结构,你可以为每个项目定义自己的层级类型(IntGrid、Entities、Tiles 三大类),而不是被 Tiled 的固定图层模型束缚。
原生实体系统:在 LDtk 里定义"玩家出生点"、"敌人"、"道具"这类对象,不需要自己写坐标解析,LDtk 直接导出结构化的实体数据。
自动图块(Autotile):只需要绘制 3 张基础图块,LDtk 自动生成 47 种变体,墙角、边缘、平地自动识别,不需要手动拼贴。
多引擎官方支持:LDtk 官方维护 Unity、Godot、Defold 的集成库,开箱即用,不需要自己解析 JSON。
核心概念
Levels(关卡)
LDtk 的基本单元是 Level,每个 Level 是一张独立的地图/场景。可以独立设计,也可以用 World 模式把多个 Level 组合成一张大地图。
Layers(图层类型)
LDtk 有三种内置图层类型:
IntGrid:整数网格层,值为整数的格子图,常用于路径网格、碰撞区域、可步行区。
Tiles:精灵图层,存放实际像素画的图块。
Entities:实体层,放置游戏对象(玩家、NPC、道具),每个实体有类型、坐标、自定义字段。
Auto-layer(自动图层)
LDtk 支持根据 IntGrid 的值自动生成 Tiles——比如 IntGrid 里值为 1 的格子代表墙,自动在 Tiles 图层生成对应的墙砖图案。这大大减少了手动摆放图块的工作量。
Unity 集成实战
安装 LDtkUnity
1. Unity Package Manager → Add package from git URL
2. 输入:https://github.com/MaddyThorson/LDtkImporter.git
3. 导入你的 .ldtk 文件到 Assets
4. LDtk 面板自动解析,生成场景层级
读取关卡数据
// 加载 .ldtk 文件
var ldtk = LDtkReader.LoadFromFile("Assets/Levels/my_level.ldtk");
// 获取第一个关卡
var level = ldtk.Levels[0];
// 读取图层
foreach (var layer in level.Layers)
{
if (layer is TilesLayer tiles)
{
// 遍历每个图块
foreach (var tile in tiles.Tiles)
Debug.Log($"Tile at {tile.X}, {tile.Y}");
}
}
实体系统
在 LDtk 编辑器里定义实体后,导出到 Unity:
// 读取所有玩家出生点
var spawnPoints = level.Entities
.Where(e => e.Identifier == "PlayerSpawn")
.Select(e => new Vector2Int(e.X, e.Y));
// 读取敌人
var enemies = level.Entities
.Where(e => e.Identifier == "Enemy");
Godot 集成实战
安装 LDtkGodot
LDtk 有官方的 Godot 4.x 插件,直接在 AssetLib 里搜索 "LDtkImporter"。
# 加载关卡
var ldtk_file = LDtkLoader.load("res://levels/world_01.ldtk")
# 读取层级
for level in ldtk_file.levels:
print("关卡: ", level.name)
for layer in level.layers:
print(" 图层: ", layer.name)
与其他关卡工具的选择
| 工具 | 适合场景 | 缺点 |
|---|---|---|
| LDtk | 现代 2D 游戏,独立团队 | 不支持 3D |
| Tiled | 传统 2D 游戏,需要复杂自定义 | 集成成本高 |
| Ogmo Editor | Platformer 类游戏 | 生态较小 |
如果你做的是平台跳跃、RPG 或任何以 2D 为主的游戏,LDtk 的自定义层级和自动图块功能可以显著提升关卡设计效率。《Celeste》的关卡全部用 LDtk 设计——这个案例本身就是质量背书。
快速上手路线图
第一天:安装 LDtk,创建一个测试关卡,感受 Auto-layer 和实体系统的威力。
第一周:把项目中的 Tiled 文件导出为 LDtk 格式,用 LDtk 的自动生成功能重建关卡。
第一个月:建立团队的 LDtk 规范——图层命名规则、实体字段规范、导出工作流,形成可复用的项目模板。
