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()
{