fix(combat): 弹反阵营感知——仅玩家弹反才翻转投射物阵营与目标层

新增 Projectile.ReflectBy(parrier):按弹反者根节点 Tag 区分阵营。玩家弹反走原 ReflectAsPlayerProjectile(切 PlayerProjectile 层+切换伤害目标层);敌人弹反敌人投射物时阵营层与目标层均保持不变(仍是敌方投射物、仍打玩家侧),仅反转方向并重置命中记录与预算。HurtBox 弹反分支改传弹反者 Transform;ParryableProjectile 手写弹反分支同步加阵营判断。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-12 10:49:23 +08:00
parent 5922ef373d
commit 862a1e5899
4 changed files with 36 additions and 9 deletions

View File

@@ -71,9 +71,31 @@ namespace BaseGames.Combat
}
/// <summary>
/// 弹反:将投射物阵营从 EnemyProjectile 切换为 PlayerProjectile
/// 阵营感知弹反入口:根据弹反者阵营决定反射行为
/// 玩家弹反 → 切 PlayerProjectile 层并切换伤害目标层(走 <see cref="ReflectAsPlayerProjectile"/>
/// 敌人弹反 → 阵营层与伤害目标层均保持不变(仍是敌方投射物、仍打玩家侧),仅反转方向并重置命中记录。
/// 由 HurtBox.ReceiveDamage() 在弹反成功后调用,传入弹反者 Transform。
/// </summary>
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;
}
/// <summary>
/// 玩家弹反:将投射物阵营从 EnemyProjectile 切换为 PlayerProjectile。
/// 反转飞行方向,并重置 HitBox 命中记录使其能够命中新目标(敌人)。
/// 由 HurtBox.ReceiveDamage() 在弹反成功后调用。
/// </summary>
public virtual void ReflectAsPlayerProjectile()
{