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:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user