You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot等距Tilemap:如何获取点击瓦片所在图层?

获取等距Tilemap点击瓦片所在图层的方案

核心实现:遍历图层检测瓦片数据

因为get_cell_tile_data必须指定图层索引,最直接的方法是遍历Tilemap的所有图层,检查点击坐标对应的单元格在哪个图层存在有效瓦片数据。如果需要获取视觉上最上层的瓦片(被点击的可见瓦片),建议从最高索引的图层往下遍历,找到第一个非空的瓦片数据即可。

示例代码:

func _input(event):
    if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
        # 转换鼠标位置为Tilemap单元格坐标
        var clicked_cell = local_to_map(get_local_mouse_position())
        
        # 从最上层图层往下遍历,优先获取可见的顶层瓦片
        for layer in range(get_layers_count() - 1, -1, -1):
            var tile_data = get_cell_tile_data(layer, clicked_cell)
            if tile_data != null:
                # 拿到目标图层索引,可用于获取数据或后续操作
                print("点击瓦片所在图层:", layer)
                
                # 获取瓦片自定义数据(需提前在TileSet中设置自定义属性)
                var custom_data = tile_data.get_custom_data("custom_key")
                if custom_data != null:
                    print("瓦片自定义数据:", custom_data)
                
                # 在该图层上方放置内容(确保目标图层存在)
                var target_layer = layer + 1
                if target_layer < get_layers_count():
                    # 示例:在目标图层放置瓦片(参数:图层,单元格坐标,瓦片ID,偏移)
                    set_cell(target_layer, clicked_cell, 1, Vector2.ZERO)
                break

其他可选思路

  • 图层用途标记:如果图层有明确分工(如地面、装饰、交互层),可以在Tilemap的图层面板给图层命名,遍历时通过get_layer_name(layer)判断图层类型,缩小检测范围。
  • 共享数据字典:若不同图层的同位置瓦片有关联数据,可单独维护一个字典,用(layer, clicked_cell.x, clicked_cell.y)作为键存储数据,拿到图层索引后直接查询。
  • 射线检测辅助:添加RayCast2D节点,设置碰撞掩码只检测Tilemap,通过get_collider()和get_collision_point()辅助确认,但对于Tilemap来说,local_to_map已经足够高效。

内容的提问来源于stack exchange,提问作者TommyBs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:02:21