From 862a1e58992461562d7e4d4caeb2fc576b085ae7 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Fri, 12 Jun 2026 10:49:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(combat):=20=E5=BC=B9=E5=8F=8D=E9=98=B5?= =?UTF-8?q?=E8=90=A5=E6=84=9F=E7=9F=A5=E2=80=94=E2=80=94=E4=BB=85=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6=E5=BC=B9=E5=8F=8D=E6=89=8D=E7=BF=BB=E8=BD=AC=E6=8A=95?= =?UTF-8?q?=E5=B0=84=E7=89=A9=E9=98=B5=E8=90=A5=E4=B8=8E=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 Projectile.ReflectBy(parrier):按弹反者根节点 Tag 区分阵营。玩家弹反走原 ReflectAsPlayerProjectile(切 PlayerProjectile 层+切换伤害目标层);敌人弹反敌人投射物时阵营层与目标层均保持不变(仍是敌方投射物、仍打玩家侧),仅反转方向并重置命中记录与预算。HurtBox 弹反分支改传弹反者 Transform;ParryableProjectile 手写弹反分支同步加阵营判断。 Co-Authored-By: Claude Opus 4.8 (1M context) --- Assets/_Game/Scripts/Combat/DamageInfo.cs | 2 +- Assets/_Game/Scripts/Combat/HurtBox.cs | 5 ++-- .../Scripts/Combat/ParryableProjectile.cs | 12 ++++++--- Assets/_Game/Scripts/Combat/Projectile.cs | 26 +++++++++++++++++-- 4 files changed, 36 insertions(+), 9 deletions(-) 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() {