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

如何检测游戏角色最近的敌人?双敌人场景仅单个可触发检测问题排查

问题成因
  • 核心逻辑错误:遍历敌人列表时没有保留符合条件的结果,每次遍历单个敌人都会直接覆盖closeEnemy的值。假设场景内两个敌人的遍历顺序为敌人A→敌人B,当你靠近敌人A时,遍历到A会把closeEnemy赋值为A,但紧接着遍历到不在范围内的B时,会直接把closeEnemy重置为null,最终导致靠近A也识别失败,只有靠近遍历顺序靠后的那个敌人才会正常生效,和你遇到的现象完全匹配。
  • 隐藏问题:如果同时有多个敌人在范围内,当前逻辑只会保留最后一个遍历到的敌人,无法正确识别最近的目标。
解决方案

基础修复版(满足单敌人识别需求)

每次检测前先重置目标为空,仅当敌人符合距离要求时才更新目标,不会被不符合要求的敌人重置:

private void UpdateTarget()
{
    // 每次检测前先重置目标
    closeEnemy = null;
    Target = GameObject.FindGameObjectsWithTag("Enemy");

    foreach(GameObject enemy in Target)
    {
        float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);
        if(distanceToEnemy < range)
        {
            closeEnemy = enemy;
            // 如果只需要识别第一个符合条件的敌人,可加break提前结束遍历
        }
    }
}

优化版(自动识别范围内最近的敌人)

如果需要优先选择最近的敌人,可增加最短距离判断逻辑:

private void UpdateTarget()
{
    closeEnemy = null;
    // 初始最小距离设为触发阈值
    float minDistance = range;
    Target = GameObject.FindGameObjectsWithTag("Enemy");

    foreach(GameObject enemy in Target)
    {
        float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);
        // 仅当距离小于当前记录的最小距离时更新目标
        if(distanceToEnemy < minDistance)
        {
            minDistance = distanceToEnemy;
            closeEnemy = enemy;
        }
    }
}

内容的提问来源于stack exchange,提问作者Muhammed Enes Ekinci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:57:03