为什么我的 Raycast2D 无法从我的瓷砖地图中检测到墙壁

Why doesn't my Raycast2Ds detect walls from my tilemap

我目前正在尝试制作一个带有网格移动的小型俯视角色扮演游戏。 为了简化事情,当我需要让某物单向移动时,我使用 RayCast2D 节点并查看它是否发生碰撞,以了解我是否可以移动所说的东西。 但是,它似乎没有检测到我放置的墙,直到我进入它们。

我已经检查了碰撞层等,它们似乎设置正确。 我做错了什么?

更多信息如下:

这是光线投射检查的代码:

func is_path_obstructed_by_obstacle(x,y):
    $Environment_Raycast.set_cast_to(Vector2(GameVariables.case_width * x * rayrange, GameVariables.case_height * y * rayrange))
    return $Environment_Raycast.is_colliding()

我的墙来自 TileMap,并设置了碰撞。所有使用碰撞的东西现在都在默认层上

还有让我的角色移动的功能:

func move():
    var direction_vec = Vector2(0,0)
    
    if Input.is_action_just_pressed("ui_right"):
        direction_vec = Vector2(1,0)
    if Input.is_action_just_pressed("ui_left"):
        direction_vec = Vector2(-1,0)
    if Input.is_action_just_pressed("ui_up"):
        direction_vec = Vector2(0,-1)
    if Input.is_action_just_pressed("ui_down"):
        direction_vec = Vector2(0,1)
    
    if not is_path_obstructed(direction_vec.x, direction_vec.y):
        position += Vector2(GameVariables.case_width * direction_vec.x, GameVariables.case_height * direction_vec.y)
        grid_position += direction_vec
    
    return

对于光线投射,始终确保它是 enabled

以防万一,我还会提到光线投射 cast_to 在光线投射局部坐标中。

当然会应用碰撞层,默认情况下会启用光线投射 exclude_parent,但我怀疑这是问题所在。

最后,请记住物理框架上的光线投射更新,因此如果您从 _process 使用它,它可能会给您过时的结果。你可以在上面调用call force_update_transformforce_raycast_update来解决。如果您需要移动它并在同一帧上多次检查,您也会这样做。


对于调试,您可以在调试菜单中打开碰撞形状,这样您就可以在 运行 游戏时看到它们,并查看光线投射的位置是否正确。如果未启用光线投射,则不会出现。此外,默认情况下,它们在碰撞某些东西时会变成红色。