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

Godot敌人检测到玩家进入检测区后不追踪仍左行问题求助

Godot 2D敌人进入追逐状态后持续左移不追踪玩家修复

问题现象

使用Godot引擎开发2D游戏时出现逻辑异常:玩家进入敌人检测区域后,敌人未执行预设的玩家追踪逻辑,持续保持向左直行。

已提供参考材料

  • 检测区域配置截图:检测区域配置截图
  • 敌人代码截图:敌人代码编辑截图
  • 敌人完整GDScript实现代码:
const EnemyDeathEffect = preload("res://Bots/EnemyDeathEffect.tscn")

export var MAX_SPEED = 60
export var ACCELERATION= 25
export var FRICTION = 700

enum {
    IDLE,
    WANDER,
    CHASE
}

var velocity = Vector2.ZERO
var knockback = Vector2.ZERO

var state = CHASE
var path: PoolVector2Array

onready var sprite = $AnimatedSprite
onready var stats = $Stats
onready var playerDetectionZone = $PlayerDetectionZone 

func _physics_process(delta):
    knockback = knockback.move_toward(Vector2.ZERO, FRICTION * delta)
    knockback = move_and_slide(knockback)
    
    match state:
        IDLE:
            velocity = velocity.move_toward(Vector2.ZERO, FRICTION * delta)
            seek_player()
            
        WANDER:
            pass
        
        CHASE:
            var player = playerDetectionZone.player
            if player != null:
                var direction = (player.position - global_position).normalized()
                velocity = velocity.move_toward(direction * MAX_SPEED , ACCELERATION * delta)
                print(direction)
            else:
                state = IDLE
            sprite.flip_h = velocity.x > 0
                
    velocity = move_and_slide(velocity)

func seek_player():
    if playerDetectionZone.can_see_player():
        state = CHASE
    
func _on_Hurtbox_area_entered(area):
    stats.health -= area.damage
    knockback = area.knockback_vector * 100

func _on_Stats_no_health():
    queue_free()
    var enemyDeathEffect = EnemyDeathEffect.instance()
    get_parent().add_child(enemyDeathEffect)
    enemyDeathEffect.global_position = global_position

核心问题定位

  1. 方向计算坐标系不匹配:这是导致敌人持续左移的直接原因。代码中计算敌人到玩家的方向向量时,混用了本地坐标和全局坐标:player.position是玩家节点相对于其父节点的本地坐标,global_position是敌人的全局坐标,当玩家和敌人不在同一个父节点下时,两个值的参考坐标系不一致,计算出的方向向量完全错误,x分量长期为负值,因此敌人一直向左移动。
  2. 移动逻辑重复调用move_and_slide:_physics_process中先后对击退向量knockback和常规移动速度velocity单独调用move_and_slide,两次移动计算叠加会导致速度异常、碰撞检测响应失真。
  3. 初始状态配置不合理:敌人初始状态直接设为CHASE,但玩家检测逻辑seek_player()仅在IDLE状态下执行,游戏启动第一帧如果检测区还未获取到玩家引用,会直接切回IDLE,后续如果检测区信号连接存在问题,很容易出现追逐逻辑不触发的问题。

修复步骤

1. 修正方向计算的坐标引用

将追逐状态下的方向计算改为全全局坐标运算,保证向量计算的坐标系统一,无论节点层级如何调整都不会出现方向计算错误:

CHASE:
    var player = playerDetectionZone.player
    if player != null:
        # 替换player.position为player.global_position,统一使用全局坐标
        var direction = (player.global_position - global_position).normalized()
        velocity = velocity.move_toward(direction * MAX_SPEED , ACCELERATION * delta)
        print(direction) # 调试时可确认打印的方向向量与玩家相对位置一致
    else:
        state = IDLE
    # 翻转逻辑根据精灵初始朝向调整:如果精灵默认素材朝左保留现有逻辑,默认朝右则改为sprite.flip_h = velocity.x < 0
    sprite.flip_h = velocity.x > 0

2. 合并移动逻辑

将击退速度和常规移动速度合并后,统一调用一次move_and_slide,避免重复计算引发的移动异常:

func _physics_process(delta):
    knockback = knockback.move_toward(Vector2.ZERO, FRICTION * delta)
    
    match state:
        IDLE:
            velocity = velocity.move_toward(Vector2.ZERO, FRICTION * delta)
            seek_player()
            
        WANDER:
            # 后续可补充游荡移动逻辑
            pass
        
        CHASE:
            var player = playerDetectionZone.player
            if player != null:
                var direction = (player.global_position - global_position).normalized()
                velocity = velocity.move_toward(direction * MAX_SPEED , ACCELERATION * delta)
            else:
                state = IDLE
            sprite.flip_h = velocity.x > 0
    # 合并两个速度向量后统一处理移动和碰撞
    velocity = move_and_slide(velocity + knockback)

3. 修正初始状态

将敌人初始状态改为IDLE,让检测逻辑按设计流程触发:

# 原代码 var state = CHASE
var state = IDLE

额外排查点

如果修改后仍存在检测异常,检查PlayerDetectionZone节点的以下配置:

  • 碰撞层和掩码是否正确匹配玩家节点的碰撞层
  • body_entered/area_entered、body_exited/area_exited信号是否正确连接,player变量是否在玩家进入/离开区域时正确赋值/清空
  • can_see_player()的射线检测是否正确排除了障碍物遮挡、射线起始点和碰撞掩码配置是否正确

内容的提问来源于stack exchange,提问作者André Pimentel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:39:18