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

Godot 4.0中碰撞后无法移除大于1单位尺寸的Tile问题求助

解决Godot 4.0中大尺寸Tile碰撞后无法移除的问题

从你提供的日志能明显看出核心问题:碰撞后计算出的单元格坐标(33, 4)不在实际使用的单元格列表里,说明坐标转换逻辑对大尺寸Tile不适用,导致你操作了空单元格,自然看不到Tile被移除。

快速修复方案:直接获取碰撞Tile的单元格坐标

Godot的TileMap在碰撞发生时,会把被碰撞Tile的单元格坐标存在碰撞信息的元数据里,直接读取即可,无需手动转换坐标:

if collision.get_collider().get_class() == "TileMap":
    print_debug("ball hit tilemap")
    var cell = collision.get_meta("tile_position")
    tilemap.set_cell(0, cell, -1)

原代码问题分析

你之前用collision.get_position() - collision.get_normal()计算位置,对1x1 Tile有效是因为Tile尺寸和单元格大小完全匹配,碰撞点转换后刚好对应正确的单元格。但3x3尺寸的Tile,碰撞点可能落在Tile的边缘区域,手动调整后的坐标会偏移到相邻的空单元格,就像日志里的(33,4),而实际目标Tile在(34,3)。

如果不想用元数据的方式,也可以改用world_to_map直接转换碰撞点的全局坐标:

if collision.get_collider().get_class() == "TileMap":
    print_debug("ball hit tilemap")
    var cell = tilemap.world_to_map(collision.get_position())
    tilemap.set_cell(0, cell, -1)

关于编辑器警告

你提到的editor/plugins/tiles/tile_set_editor.cpp:227警告是编辑器层面的问题,和运行时的Tile移除功能无关,不用理会。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:25:34