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

如何修复Grid Tilemap以适配特定区域(附脚本与图片)

Godot 4.2.2 TileMap与网格适配调整方案

基础信息

  • Godot版本:4.2.2
  • 场景结构:根节点Node2D,子节点包括GridDraw(自定义绘制网格)和TileMap(承载瓦片)
  • 核心设置:竖屏视口576×1024,瓦片/网格单元格尺寸64px

问题核心

当前通过脚本手动绘制网格和填充瓦片,需要调整为TileMap与网格精准适配特定区域,达到预期场景效果。

具体调整步骤

1. 弃用自定义GridDraw,改用TileMap自带网格

TileMap本身自带网格显示功能,完全能替代自定义绘制,还能保证和瓦片100%对齐:

  • 选中TileMap节点,在Inspector面板找到「Visible」分类,勾选「Grid Visible」
  • 到「Grid」分类里,直接设置网格的颜色、线宽(可以改成你之前用的卡其色/印第安红)
  • 删除GridDraw节点和对应的grid_draw.gd脚本,避免双重网格冲突

2. 校准TileMap网格原点与视口对齐

之前自定义网格加了32px的偏移(64/2),现在要让TileMap的网格跟上这个偏移:

  • 选中TileMap,在Inspector的「Grid」分类中,设置「Offset」为Vector2(32, 32)
  • 确认「Cell Size」是Vector2(64, 64),和瓦片尺寸保持一致

3. 修正瓦片填充脚本的区域逻辑

原来的脚本用local_to_map计算范围容易偏移,改成精准的坐标计算,同时补全循环范围避免漏填:

修改后的tilemap_grid.gd:

extends Node2D
   
const LAYER = 1; # ground层
var terrain_set_id = 0;
var terrain_id = 0;
var viewport_size: Vector2;
enum Tilesets {
    Terrains, Objects
}
    
@onready var tile_map: TileMap = $TileMap;
    
func _ready() → void:
    viewport_size = get_viewport().get_size();
    # 计算视口对应的完整TileMap坐标范围(匹配之前的偏移)
    var start_cell = tile_map.local_to_map(Vector2(-32, -32))
    var end_cell = tile_map.local_to_map(viewport_size + Vector2(32, 32))

    # 填充水域
    fill_area_with_tile(
        start_cell,
        end_cell,
        Tilesets.Terrains,
        Vector2i(0,12)
    );

    # 填充基础岛屿地形
    fill_area_with_terrain_connected(
        Vector2i(1,6),
        Vector2i(8,13),
        LAYER,
        terrain_set_id,
        terrain_id
    );

func fill_area_with_tile(start: Vector2i, end: Vector2i, tileset_id: int, tile_coords: Vector2i, layer: int = 0) → void:
    # 循环范围包含end_cell的坐标,避免漏填边缘
    for x in range(start.x, end.x + 1):
        for y in range(start.y, end.y + 1):
            tile_map.set_cell(layer, Vector2i(x,y), tileset_id, tile_coords );

func fill_area_with_terrain_connected(start: Vector2i, end: Vector2i, layer: int, terrain_set_id: int, terrain_id: int) → void:
    for x in range(start.x, end.x + 1):
        for y in range(start.y, end.y + 1):
            tile_map.set_cells_terrain_connect(layer, [Vector2i(x,y)], terrain_set_id, terrain_id)

说明:

  • 调整了起始单元格的计算,确保覆盖视口外的偏移区域,避免边缘瓦片截断
  • 循环范围改成end.x+1和end.y+1,确保所有目标单元格都被填充
  • 移除了脚本里没用的冗余变量

4. 验证适配效果

运行场景后检查:

  • TileMap的网格线和瓦片完全对齐
  • 水域、岛屿区域准确覆盖预期范围
  • 视口边缘没有瓦片截断或网格偏移的问题

内容的提问来源于stack exchange,提问作者Rafael de Castro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:13:16