Godot - 当玩家在左边时,敌人不会移动到玩家身边
Godot - Enemy does not move to player when player is on the left
当玩家在左边时,我游戏中的敌人不会向左移动,而是向右移动。然后当玩家在右边时,敌人会移动到玩家身边。
敌人代码:
extends KinematicBody2D
var run_speed = 100
var velocity = Vector2.ZERO
var collider = null
func _physics_process(delta):
velocity = Vector2.ZERO
if collider:
velocity = position.direction_to(collider.position) * run_speed
velocity = move_and_slide(velocity)
func _on_DetectRadius_body_entered(body):
collider = body
func _on_DetectRadius_body_exited(body):
collider = null
我怀疑您正在使用 Area2D
,它正在检测玩家角色以外的东西。我提醒您可以使用 collision_mask
和 collision_layer
来缩小检测到的对象范围。 例如,你确定Area2D
没有探测到敌人本身吗?为了快速检查,您可以让 Godot 打印 collider
以仔细检查它是否符合您的预期。
此外,请注意,当一个对象离开 Area2D
时,它会将 collider
设置为 null
,而不管 Area2D
中是否还有某个对象。我提醒您另一种方法是使用 get_overlapping_bodies
.
当然,您可以查询每个 body
是否是玩家角色(例如通过检查其节点组、名称、class 等... ).我在 another answer.
中详细介绍了过滤
如果你正在获取玩家角色,还有另一个可能的问题来源:position
vs global_position
。你的代码是这样的:
position.direction_to(collider.position)
如果敌人和它得到的 collider
有相同的父对象,那么
是正确的。在那种情况下,他们的位置是相同的 space。否则,您可能想要处理全局坐标:
global_position.direction_to(collider.global_position)
或者你可以把collider
的位置带到本地坐标:
position.direction_to(to_local(collider.global_position))
当然,还要仔细检查 Area2D
的位置是否正确。您可以在“调试”菜单中启用“可见碰撞形状”,当 运行 游戏从编辑器中显示时会显示。
当玩家在左边时,我游戏中的敌人不会向左移动,而是向右移动。然后当玩家在右边时,敌人会移动到玩家身边。
敌人代码:
extends KinematicBody2D
var run_speed = 100
var velocity = Vector2.ZERO
var collider = null
func _physics_process(delta):
velocity = Vector2.ZERO
if collider:
velocity = position.direction_to(collider.position) * run_speed
velocity = move_and_slide(velocity)
func _on_DetectRadius_body_entered(body):
collider = body
func _on_DetectRadius_body_exited(body):
collider = null
我怀疑您正在使用 Area2D
,它正在检测玩家角色以外的东西。我提醒您可以使用 collision_mask
和 collision_layer
来缩小检测到的对象范围。 例如,你确定Area2D
没有探测到敌人本身吗?为了快速检查,您可以让 Godot 打印 collider
以仔细检查它是否符合您的预期。
此外,请注意,当一个对象离开 Area2D
时,它会将 collider
设置为 null
,而不管 Area2D
中是否还有某个对象。我提醒您另一种方法是使用 get_overlapping_bodies
.
当然,您可以查询每个 body
是否是玩家角色(例如通过检查其节点组、名称、class 等... ).我在 another answer.
如果你正在获取玩家角色,还有另一个可能的问题来源:position
vs global_position
。你的代码是这样的:
position.direction_to(collider.position)
如果敌人和它得到的 collider
有相同的父对象,那么
是正确的。在那种情况下,他们的位置是相同的 space。否则,您可能想要处理全局坐标:
global_position.direction_to(collider.global_position)
或者你可以把collider
的位置带到本地坐标:
position.direction_to(to_local(collider.global_position))
当然,还要仔细检查 Area2D
的位置是否正确。您可以在“调试”菜单中启用“可见碰撞形状”,当 运行 游戏从编辑器中显示时会显示。