feat(combat): 投射物接入伤害目标层过滤,弹反阵营/目标同步翻转

HitBox 暴露 TargetLayers 运行时读写。Projectile 缓存预制体初始目标层并在 Initialize 还原(对象池复用不被上一发弹反污染);ReflectAsPlayerProjectile 时目标层随阵营翻转(PlayerHurtBox→EnemyHurtBox,保留可破坏物等其他位)。

ParryableProjectile 绕过 HitBox 自行判定,补上同样的目标层过滤;并修复其弹反分支不切 PlayerProjectile 层的问题——原先反射后仍留在 EnemyProjectile 层,碰撞矩阵 EnemyProjectile↔EnemyHurtBox 不碰撞,反射弹永远打不中敌人。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-12 10:34:43 +08:00
parent ef7ff63b67
commit 1866f323e4
3 changed files with 41 additions and 0 deletions

View File

@@ -34,6 +34,13 @@ namespace BaseGames.Combat
Direction = -Direction;
_rb.velocity = Direction * _config.Speed * _config.ParrySpeedMultiplier;
// 阵营随弹反翻转:切到 PlayerProjectile 层(否则碰撞矩阵
// EnemyProjectile↔EnemyHurtBox 不碰撞,反射后永远打不中敌人),
// 伤害目标层同步从玩家侧切到敌人侧。
int playerProjLayer = LayerMask.NameToLayer("PlayerProjectile");
if (playerProjLayer >= 0) gameObject.layer = playerProjLayer;
RetargetToEnemyFaction();
if (_reflectSource != null)
DamageInfo = DamageInfo.From(_reflectSource);
return;
@@ -41,6 +48,8 @@ namespace BaseGames.Combat
}
// ── 正常命中 ─────────────────────────────────────────────────
// 本类绕过 HitBox 自行判定,需自行套用其伤害目标层过滤
if ((_hitBox.TargetLayers.value & (1 << other.gameObject.layer)) == 0) return;
var hurtBox = other.GetComponent<HurtBox>();
if (hurtBox != null)
{