From 048595887e6472ac584b698b0fe60f51c2267e7e Mon Sep 17 00:00:00 2001 From: walkpan Date: Sun, 17 May 2026 21:36:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(hero=20cast):=20=E8=B0=83=E6=95=B4=E6=95=8C?= =?UTF-8?q?=E6=88=91=E5=8D=95=E4=BD=8D=E7=9A=84=E7=9B=AE=E6=A0=87=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构了SCastSystem中的目标查找逻辑,区分英雄和怪物的目标选择规则:英雄仅按X轴距离选择最近目标,怪物优先选择中路目标后再比较距离,同时更新了对应注释说明。 --- assets/script/game/hero/SCastSystem.ts | 82 ++++++++++++++++---------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/assets/script/game/hero/SCastSystem.ts b/assets/script/game/hero/SCastSystem.ts index b004d634..429565a2 100644 --- a/assets/script/game/hero/SCastSystem.ts +++ b/assets/script/game/hero/SCastSystem.ts @@ -549,7 +549,8 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate const currentY = heroView.node.position.y; let nearest: HeroViewComp | null = null; let minDist = Infinity; - let foundSameLane = false; + let foundPreferredLane = false; + const isHero = heroAttrs.fac === FacSet.HERO; ecs.query(this.getHeroMatcher()).forEach(entity => { const attrs = entity.get(HeroAttrsComp); @@ -562,23 +563,29 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate const distX = Math.abs(currentX - view.node.position.x); if (distX > maxRange) return; - const isSameLane = Math.abs(currentY - view.node.position.y) < 30; // 30为容差 + if (isHero) { + // 英雄:单纯找X轴最近,无视路线 + if (distX < minDist) { + minDist = distX; + nearest = view; + } + } else { + // 怪物:优先找中路目标 + const isMidLane = Math.abs(view.node.position.y) < 30; // 0 是中路 - // 如果之前找到了同路目标,且当前不是同路,直接跳过 - if (foundSameLane && !isSameLane) return; + if (foundPreferredLane && !isMidLane) return; - // 如果当前是同路,且之前没找到同路,则强制替换(同路优先) - if (isSameLane && !foundSameLane) { - foundSameLane = true; + if (isMidLane && !foundPreferredLane) { + foundPreferredLane = true; + minDist = distX; + nearest = view; + return; + } + + if (distX >= minDist) return; minDist = distX; nearest = view; - return; } - - // 同等路况下比较距离 - if (distX >= minDist) return; - minDist = distX; - nearest = view; }); return nearest; } @@ -586,7 +593,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate /** * 在施法距离内查找“最前排”敌人。 * 依据施法者面向方向选择 x 轴上更前的目标。 - * 考虑三路设计:同路优先 + * 考虑三路设计:英雄找最前排,怪物优先找中路最前排 */ private findFrontEnemyInRange(heroAttrs: HeroAttrsComp, heroView: HeroViewComp, maxRange: number, nearestEnemy: HeroViewComp): HeroViewComp | null { if (!heroView.node || !nearestEnemy.node) return null; @@ -595,7 +602,8 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate const direction = nearestEnemy.node.position.x >= currentX ? 1 : -1; let frontEnemy: HeroViewComp | null = null; let edgeX = direction > 0 ? Infinity : -Infinity; - let foundSameLane = false; + let foundPreferredLane = false; + const isHero = heroAttrs.fac === FacSet.HERO; ecs.query(this.getHeroMatcher()).forEach(entity => { const attrs = entity.get(HeroAttrsComp); @@ -609,24 +617,38 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate const dist = Math.abs(currentX - enemyX); if (dist > maxRange) return; - const isSameLane = Math.abs(currentY - view.node.position.y) < 30; - if (foundSameLane && !isSameLane) return; - - if (isSameLane && !foundSameLane) { - foundSameLane = true; - edgeX = enemyX; + if (isHero) { + // 英雄:无视路线,找X轴最前的 + if (direction > 0) { + if (enemyX >= edgeX) return; + edgeX = enemyX; + } else { + if (enemyX <= edgeX) return; + edgeX = enemyX; + } frontEnemy = view; - return; - } - - if (direction > 0) { - if (enemyX >= edgeX) return; - edgeX = enemyX; } else { - if (enemyX <= edgeX) return; - edgeX = enemyX; + // 怪物:优先找中路最前排的 + const isMidLane = Math.abs(view.node.position.y) < 30; + + if (foundPreferredLane && !isMidLane) return; + + if (isMidLane && !foundPreferredLane) { + foundPreferredLane = true; + edgeX = enemyX; + frontEnemy = view; + return; + } + + if (direction > 0) { + if (enemyX >= edgeX) return; + edgeX = enemyX; + } else { + if (enemyX <= edgeX) return; + edgeX = enemyX; + } + frontEnemy = view; } - frontEnemy = view; }); return frontEnemy; }