为什么我的 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_transform
和force_raycast_update
来解决。如果您需要移动它并在同一帧上多次检查,您也会这样做。
对于调试,您可以在调试菜单中打开碰撞形状,这样您就可以在 运行 游戏时看到它们,并查看光线投射的位置是否正确。如果未启用光线投射,则不会出现。此外,默认情况下,它们在碰撞某些东西时会变成红色。
我目前正在尝试制作一个带有网格移动的小型俯视角色扮演游戏。 为了简化事情,当我需要让某物单向移动时,我使用 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_transform
和force_raycast_update
来解决。如果您需要移动它并在同一帧上多次检查,您也会这样做。
对于调试,您可以在调试菜单中打开碰撞形状,这样您就可以在 运行 游戏时看到它们,并查看光线投射的位置是否正确。如果未启用光线投射,则不会出现。此外,默认情况下,它们在碰撞某些东西时会变成红色。