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

多目标锁定系统右侧目标检测未更新问题排查求助

多目标锁定系统右侧目标检测异常排查求助

我正在开发一套多目标锁定系统,已经实现基于用户输入定向切换锁定目标的功能,但实际使用时发现当前锁定对象右侧的目标检测从未更新,导致目标切换顺序异常。我找不到问题原因,因为右侧检测的代码逻辑和正常工作的左侧检测完全一致。以下是相关代码,恳请帮忙排查问题并提供解决思路:

Part 1: 目标管理代码

void ManageTargets()
{
    shortDistLeft = Mathf.Infinity;
    shortDistRight = Mathf.Infinity;

    for (int i = 0; i < availableTars.Count; i++)
    {
        float dist = Vector3.Distance(transform.position, availableTars[i].transform.position);
        
        if (dist <= shortestDist)
        {
            shortestDist = dist;
            closestLockOnTarget = availableTars[i];
            currentTarget = closestLockOnTarget;
        }
        if(dist >= maxLockDist)
        {
            lockOn = false;
            shortestDist = Mathf.Infinity;
            availableTars.Clear();
            currentTarget = null;
            closestLockOnTarget = null;
            PlayerStateManager.instance.camState = 0;
        }
        if (lockOn)
        {
            Vector3 relativeEnemyPos = currentTarget.transform.InverseTransformPoint(availableTars[i].transform.position);
            var distanceFromLeftTarget = currentTarget.transform.position.x - availableTars[i].transform.position.x;
            var distanceFromRightTarget = currentTarget.transform.position.x + availableTars[i].transform.position.x;

            if (relativeEnemyPos.x > 0.00 && distanceFromLeftTarget < shortDistLeft)
            {
                shortDistLeft = distanceFromLeftTarget;
                leftLockTarget = availableTars[i];
            }
            if (relativeEnemyPos.x < 0.00 && distanceFromRightTarget < shortDistRight)
            {
                shortDistRight = distanceFromRightTarget;
                rightLockTarget = availableTars[i];
            }
        }
    }
}

Part 2: 锁定逻辑代码

void lockOnLogic()
{
    if (lockOn)
    {
        if (currentTarget == null)
        {
            camRecenter();
            lockOn = false;
        }
        else
        {
            PlayerStateManager.instance.camState = 1;
        }

        if (lockOnMoveL == true) {
            lockOnMoveL = false;
            
            if (leftLockTarget != null)
            {
                currentTarget = leftLockTarget;
            }
            ManageTargets();
        }
        if (lockOnMoveR == true){
            lockOnMoveR = false;
                
            if (rightLockTarget != null)
            {
                currentTarget = rightLockTarget;
            }
            ManageTargets();
        }
    }
    else
    {
        shortestDist = Mathf.Infinity;
        availableTars.Clear();
        currentTarget = null;
        closestLockOnTarget = null;
        PlayerStateManager.instance.camState = 0;
        lockOnMoveR = false;
        lockOnMoveL = false;
    }
}

问题定位与解决思路

1. 核心问题:右侧目标距离计算逻辑错误

你左侧目标的距离计算是横向坐标差值(currentTarget.x - 目标.x),用来判断左侧目标的相对远近;但右侧目标的距离计算写成了currentTarget.x + 目标.x——这是坐标值相加,完全不是距离的计算方式,导致shortDistRight的比较逻辑彻底失效,根本无法正确找到右侧最近的目标。

2. 修复方案

(1)修正右侧距离计算逻辑

把右侧的距离计算改成和左侧一致的横向差值逻辑:

// 替换原右侧距离计算代码
var distanceFromRightTarget = availableTars[i].transform.position.x - currentTarget.transform.position.x;

如果需要统一距离的绝对值判断(避免正负干扰),可以改成:

// 统一横向距离计算,用绝对值确保是正数距离
float horizontalDist = Mathf.Abs(currentTarget.transform.position.x - availableTars[i].transform.position.x);

然后结合relativeEnemyPos.x的正负来区分左右目标即可。

(2)优化循环内的列表操作逻辑

当前代码在循环中如果检测到目标超出最大锁定距离,会直接清空availableTars,导致后续循环直接中断(因为列表长度变为0),可能漏掉其他目标的检测。建议先单独移除超出距离的目标,再进行锁定逻辑计算:

// 先遍历移除超出最大锁定距离的目标(倒序遍历避免索引异常)
for (int i = availableTars.Count - 1; i >= 0; i--)
{
    float dist = Vector3.Distance(transform.position, availableTars[i].transform.position);
    if (dist >= maxLockDist)
    {
        availableTars.RemoveAt(i);
    }
}
// 再执行后续的目标距离计算和锁定逻辑

(3)添加调试日志辅助排查

在ManageTargets函数的左右目标赋值逻辑后添加日志,确认每次循环中目标是否被正确识别:

// 左侧目标赋值后添加日志
if (relativeEnemyPos.x > 0.00 && distanceFromLeftTarget < shortDistLeft)
{
    shortDistLeft = distanceFromLeftTarget;
    leftLockTarget = availableTars[i];
    Debug.Log($"左侧目标更新:{leftLockTarget.name},横向差值:{shortDistLeft}");
}
// 右侧目标赋值后添加日志
if (relativeEnemyPos.x < 0.00 && distanceFromRightTarget < shortDistRight)
{
    shortDistRight = distanceFromRightTarget;
    rightLockTarget = availableTars[i];
    Debug.Log($"右侧目标更新:{rightLockTarget.name},横向差值:{shortDistRight}");
}

内容的提问来源于stack exchange,提问作者Booling96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:08:24