如何检测游戏角色最近的敌人?双敌人场景仅单个可触发检测问题排查
问题成因
- 核心逻辑错误:遍历敌人列表时没有保留符合条件的结果,每次遍历单个敌人都会直接覆盖
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
相关产品推荐
相关产品推荐

