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_maskcollision_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 的位置是否正确。您可以在“调试”菜单中启用“可见碰撞形状”,当 运行 游戏从编辑器中显示时会显示。