Godot中Raycast检测Tile时左上方向返回(-1,-1)求助
解决Raycast从左/上方碰撞Tile时get_cell_atlas_coords返回(-1,-1)的问题
核心问题出在碰撞点的位置判定:当Raycast从左侧或上方碰撞Tile时,碰撞点大概率落在Tile的边界线上,甚至被引擎判定到相邻的空白单元格。此时local_to_map转换得到的单元格位置没有Tile数据,自然get_cell_atlas_coords会返回(-1,-1)。而右下方向的Raycast碰撞点通常落在Tile内部区域,所以能正常获取数据。
解决方法
1. 给碰撞点添加方向偏移
针对不同方向的Raycast,给碰撞点添加微小偏移,确保它落在目标Tile的内部:
if $Raycasts/Left.is_colliding(): raycast_on_wall = true var tile_map: TileMap = $Raycasts/Left.get_collider(0) var hit_pos = $Raycasts/Left.get_collision_point(0) # 左侧碰撞时,向右偏移一点(比例可根据单元格大小调整) hit_pos += Vector2(1, 0) * tile_map.cell_size.x * 0.1 var cell_pos = tile_map.local_to_map(hit_pos) var tile_pos = tile_map.get_cell_atlas_coords(0, cell_pos) # 增加有效性检查,避免空数据报错 if tile_pos != Vector2(-1, -1): var data = tile_map.get_cell_tile_data(0, cell_pos) conveyor_detect = data.get_custom_data("Direction")
如果是上方的Raycast,只需把偏移改成向下:
hit_pos += Vector2(0, 1) * tile_map.cell_size.y * 0.1
2. 用碰撞法线动态适配(通用方案)
如果需要适配所有方向的Raycast,可以通过碰撞法线判断碰撞方向,自动添加偏移:
if $Raycasts/Left.is_colliding(): raycast_on_wall = true var tile_map: TileMap = $Raycasts/Left.get_collider(0) var hit_pos = $Raycasts/Left.get_collision_point(0) var collision_normal = $Raycasts/Left.get_collision_normal(0) # 沿法线方向偏移,确保点落在Tile内部 hit_pos += collision_normal * tile_map.cell_size * 0.1 var cell_pos = tile_map.local_to_map(hit_pos) var tile_pos = tile_map.get_cell_atlas_coords(0, cell_pos) if tile_pos != Vector2(-1, -1): var data = tile_map.get_cell_tile_data(0, cell_pos) conveyor_detect = data.get_custom_data("Direction")
额外说明
- 偏移比例不用太大,0.1倍单元格大小足够让碰撞点脱离边界区域,同时不会超出Tile范围。
- 必须添加
tile_pos != Vector2(-1, -1)的检查,避免极端情况导致后续代码报错。
内容的提问来源于stack exchange,提问作者Legowyn Studios
相关产品推荐
相关产品推荐

