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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:32:33