diff --git a/Assets/_Game/Scripts/Combat/DamageInfo.cs b/Assets/_Game/Scripts/Combat/DamageInfo.cs index 730bc8f..80b813d 100644 --- a/Assets/_Game/Scripts/Combat/DamageInfo.cs +++ b/Assets/_Game/Scripts/Combat/DamageInfo.cs @@ -35,7 +35,7 @@ namespace BaseGames.Combat [System.NonSerialized] public uint HitActivationId; /// /// 攻击来源投射物(仅当攻击方是 Projectile 时非 null)。 - /// 用于弹反成功时调用 ReflectAsPlayerProjectile() 翻转阵营。 + /// 用于弹反成功时调用 ReflectBy(parrier) 按弹反者阵营反射(玩家弹反才翻转阵营)。 /// [NonSerialized]:MonoBehaviour 引用不参与 Unity 资产序列化。 /// [System.NonSerialized] public Projectile SourceProjectile; diff --git a/Assets/_Game/Scripts/Combat/HurtBox.cs b/Assets/_Game/Scripts/Combat/HurtBox.cs index 6255ff9..5ba3073 100644 --- a/Assets/_Game/Scripts/Combat/HurtBox.cs +++ b/Assets/_Game/Scripts/Combat/HurtBox.cs @@ -75,8 +75,9 @@ namespace BaseGames.Combat { if (_parrySystem.ConsumeParry()) { - // 若攻击来源是投射物,翻转其阵营 Layer 与飞行方向 - info.SourceProjectile?.ReflectAsPlayerProjectile(); + // 若攻击来源是投射物,按弹反者阵营反射: + // 玩家弹反翻转阵营 Layer 与伤害目标层;敌人弹反仅反转方向 + info.SourceProjectile?.ReflectBy(transform); return; } } diff --git a/Assets/_Game/Scripts/Combat/ParryableProjectile.cs b/Assets/_Game/Scripts/Combat/ParryableProjectile.cs index bfc0a3c..62a8b01 100644 --- a/Assets/_Game/Scripts/Combat/ParryableProjectile.cs +++ b/Assets/_Game/Scripts/Combat/ParryableProjectile.cs @@ -34,12 +34,16 @@ namespace BaseGames.Combat Direction = -Direction; _rb.velocity = Direction * _config.Speed * _config.ParrySpeedMultiplier; - // 阵营随弹反翻转:切到 PlayerProjectile 层(否则碰撞矩阵 + // 仅当弹反者是玩家时翻转阵营:切到 PlayerProjectile 层(否则碰撞矩阵 // EnemyProjectile↔EnemyHurtBox 不碰撞,反射后永远打不中敌人), // 伤害目标层同步切换(优先取配置的 ReflectedTargetLayers)。 - int playerProjLayer = LayerMask.NameToLayer("PlayerProjectile"); - if (playerProjLayer >= 0) gameObject.layer = playerProjLayer; - ApplyReflectedTargetLayers(); + // 敌人弹反敌人投射物:阵营与目标层保持不变,仅上面已反转方向。 + if (parrySystem.transform.root.CompareTag("Player")) + { + int playerProjLayer = LayerMask.NameToLayer("PlayerProjectile"); + if (playerProjLayer >= 0) gameObject.layer = playerProjLayer; + ApplyReflectedTargetLayers(); + } if (_reflectSource != null) DamageInfo = DamageInfo.From(_reflectSource); diff --git a/Assets/_Game/Scripts/Combat/Projectile.cs b/Assets/_Game/Scripts/Combat/Projectile.cs index e6f1acb..a0dd4ec 100644 --- a/Assets/_Game/Scripts/Combat/Projectile.cs +++ b/Assets/_Game/Scripts/Combat/Projectile.cs @@ -71,9 +71,31 @@ namespace BaseGames.Combat } /// - /// 弹反:将投射物阵营从 EnemyProjectile 切换为 PlayerProjectile。 + /// 阵营感知弹反入口:根据弹反者阵营决定反射行为。 + /// 玩家弹反 → 切 PlayerProjectile 层并切换伤害目标层(走 ); + /// 敌人弹反 → 阵营层与伤害目标层均保持不变(仍是敌方投射物、仍打玩家侧),仅反转方向并重置命中记录。 + /// 由 HurtBox.ReceiveDamage() 在弹反成功后调用,传入弹反者 Transform。 + /// + public virtual void ReflectBy(Transform parrier) + { + if (parrier != null && parrier.root.CompareTag("Player")) + { + ReflectAsPlayerProjectile(); + return; + } + + // ── 敌人弹反:不换阵营、不换目标层,仅反转飞行并重置判定 ── + Direction = -Direction; + _rb.velocity = -_rb.velocity; + _hitBox.Deactivate(); + _hitBox.Activate(_config?.DamageSource); + _hitsRemaining = _maxHits; + _justReflected = true; + } + + /// + /// 玩家弹反:将投射物阵营从 EnemyProjectile 切换为 PlayerProjectile。 /// 反转飞行方向,并重置 HitBox 命中记录使其能够命中新目标(敌人)。 - /// 由 HurtBox.ReceiveDamage() 在弹反成功后调用。 /// public virtual void ReflectAsPlayerProjectile() {