关于 godot-tilemap
面向 Godot 4.7 的技能指南,帮助开发者使用 TileMapLayer 与 TileSet 构建和操作 2D 瓦片关卡,并说明从旧 TileMap 节点迁移的方法。
主要功能
- 01配置 TileSet 与图集源
- 02设置碰撞、导航和自定义数据
- 03使用地形自动连接瓦片
- 04绘制及运行时读写单元格
- 05将 TileMap 迁移到 TileMapLayer
适用场景
- 01制作基于瓦片网格的 2D 关卡
- 02为瓦片设置碰撞与导航
- 03在代码中读取或修改瓦片
- 04迁移旧版 TileMap 场景
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill godot-tilemap安装后在 Claude Code 中输入/godot-tilemap确认已加载。
附带文件references/tileset-and-terrains.md
详细介绍
Godot TileMap(4.7 TileMapLayer)
使用 TileMapLayer + TileSet 创建基于瓦片的关卡,为每个瓦片添加碰撞和自定义数据,使用地形自动拼接瓦片,并在运行时操作单元格。面向 Godot 4.7;在此版本中,TileMapLayer 取代了现已弃用的 TileMap 节点。
适用场景
- 需要使用瓦片网格设计 2D 关卡、配置
TileSet(碰撞、导航、自定义数据、地形),或通过代码读取/写入瓦片时。 - 需要将
TileMap节点(单个节点包含多个图层)迁移为多个TileMapLayer节点(每个节点一个图层)时。
不适用场景: 控制玩家在瓦片上移动 → godot-2d-movement;通用物理实体/射线检测 → godot-physics;程序化地图生成算法 → procedural-gen;关卡设计实践 → level-design。
核心工作流
- 添加一个
TileMapLayer节点(每个视觉/逻辑图层各一个:背景、墙壁、前景)。每个节点只包含一个瓦片图层。 - 在图层的
tile_set属性中创建或指定TileSet。在 TileSet 编辑器中添加图集源(将纹理切分为瓦片)。将 TileSet 保存为外部.tres文件,供多个图层/关卡重复使用。 - 在 TileSet 编辑器中添加瓦片数据: 物理图层(碰撞多边形)、导航图层、遮挡,以及自定义数据图层(每个瓦片的类型化值,例如
damage或is_ladder)。 - 在 TileMap 底部面板中绘制(Paint/Line/Rectangle/Bucket)。对于可自动连接的瓦片,定义一个地形集,并使用 Connect/Path 模式绘制。
- 通过图层的
collision_enabled/navigation_enabled属性启用每个图层的碰撞/导航。 - 使用
local_to_map、set_cell、get_cell_source_id和get_cell_tile_data(...).get_custom_data(...)通过代码读取/写入。
常见模式
1. 将鼠标位置转换为单元格并读取其自定义数据
extends TileMapLayer
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseButton and event.pressed:
# local_to_map expects local coords; convert from global first.
var cell := local_to_map(to_local(event.position))
var data := get_cell_tile_data(cell) # TileData or null
if data:
var dmg: int = data.get_custom_data("damage") # custom data layer
print("Cell %s deals %d damage" % [cell, dmg])
2. 在运行时放置和擦除瓦片
# set_cell(coords, source_id, atlas_coords, alternative_tile = 0)
func place_wall(cell: Vector2i) -> void:
set_cell(cell, 0, Vector2i(2, 1)) # source 0, atlas tile at column 2, row 1
func dig(cell: Vector2i) -> void:
erase_cell(cell) # same as set_cell(cell, -1)
func clear_level() -> void:
clear() # remove every tile on this layer
3. 使用地形集自动拼接区域
# Paint a filled area with terrain `terrain` of terrain set `terrain_set`;
# Godot picks the correct edge/corner tiles to connect them.
func fill_with_grass(cells: Array[Vector2i]) -> void:
var terrain_set := 0
var grass_terrain := 0
set_cells_terrain_connect(cells, terrain_set, grass_terrain, true)
4. 遍历已放置的瓦片(例如查找所有出生点瓦片)
func find_spawns() -> Array[Vector2i]:
var spawns: Array[Vector2i] = []
for cell in get_used_cells():
var data := get_cell_tile_data(cell)
if data and data.get_custom_data("is_spawn"):
spawns.append(cell)
return spawns
注意事项
TileMap节点在 4.3 中已弃用。 请使用TileMapLayer节点(每个节点一个图层),并将它们归到父级Node2D下。旧版TileMap中接受layer参数的调用(set_cell(layer, ...))不适用于TileMapLayer。local_to_map需要局部坐标。 必须先使用to_local(...)转换鼠标/全局位置,否则单元格位置会出现偏移。get_cell_tile_data对空单元格或非图集源会返回null——调用get_custom_data前务必检查是否为 null。- 自定义数据有类型。 声明为
int的图层会返回int;以错误类型读取或引用不存在的图层名称都会报错。请先在 TileSet 中定义该图层。 - 地形需要定义所有组合。 如果 TileSet 的地形位掩码邻接关系不完整,
set_cells_terrain_connect会产生异常结果。 - 运行时编辑会批量处理到帧末。如果必须在调用
set_cell后立即读取更新后的内部数据,请调用update_internals()(开销较大——避免在循环中调用)。 - 碰撞不起作用? 检查图层的
collision_enabled、瓦片是否拥有带多边形的物理图层,以及 TileSet 的物理图层掩码是否与物理实体匹配。
参考资料
- 有关 TileSet 设置(图集源、物理/导航/自定义数据图层、地形位掩码)、场景瓦片、Y 轴排序,以及运行时瓦片数据覆盖(
_use_tile_data_runtime_update),请阅读references/tileset-and-terrains.md。
相关技能
godot-2d-movement— 在这些瓦片上行走的角色。godot-physics— 瓦片碰撞所参与的碰撞图层/掩码。procedural-gen— 使用噪声/RNG 生成瓦片地图。level-design/roguelike— 关卡设计实践和网格类游戏。
评论
支持 Markdown