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

