diff --git a/Assets/Scripts/Skills/Effectors/Projectile.cs b/Assets/Scripts/Skills/Effectors/Projectile.cs index bc0ef54..e27893b 100644 --- a/Assets/Scripts/Skills/Effectors/Projectile.cs +++ b/Assets/Scripts/Skills/Effectors/Projectile.cs @@ -43,26 +43,54 @@ namespace EerieVillage.Skills.Effectors protected virtual void OnTriggerEnter2D(Collider2D other) { - if (_hitTargets.Contains(other)) return; + // BT12-Dev 진단 (2026-05-09 PD A안) — 적 피격 X 근본 진단. + // 회수 의무: PD Console 결과 수령 + 근본 fix 적용 후 본 진단 Debug.Log 일괄 제거. + Debug.Log($"[Projectile][Enter] other={other.name} layer={other.gameObject.layer} t={Time.time:F2}"); + + if (_hitTargets.Contains(other)) + { + Debug.Log($"[Projectile][Return] _hitTargets duplicate other={other.name}"); + return; + } // PD 지시 2026-05-09 후속 방어 — 자기(Player) hit·자기 자신·hit 방어. - if (other.GetComponent() != null) return; + if (other.GetComponent() != null) + { + Debug.Log($"[Projectile][Return] PlayerController detected other={other.name}"); + return; + } // Enemy 레이어 한정. // Phase 2-D fallback (2026-05-09): TagManager에 "Enemy" 레이어 미등재 시 LayerMask.NameToLayer 반환값 = -1. // 레이어 매칭 실패 시 EnemyController 컴포넌트 존재 여부로 대체 판정. int enemyLayer = LayerMask.NameToLayer("Enemy"); - bool isEnemy = (enemyLayer != -1 && other.gameObject.layer == enemyLayer) - || other.GetComponent() != null; - if (!isEnemy) return; + bool hasEnemyController = other.GetComponent() != null; + bool isEnemy = (enemyLayer != -1 && other.gameObject.layer == enemyLayer) || hasEnemyController; + Debug.Log($"[Projectile][LayerCheck] enemyLayer={enemyLayer} otherLayer={other.gameObject.layer} hasEnemyController={hasEnemyController} isEnemy={isEnemy}"); + + if (!isEnemy) + { + Debug.Log($"[Projectile][Return] not Enemy other={other.name}"); + return; + } var health = other.GetComponent(); - if (health == null || !health.IsAlive) return; + if (health == null) + { + Debug.Log($"[Projectile][Return] Health component missing other={other.name}"); + return; + } + if (!health.IsAlive) + { + Debug.Log($"[Projectile][Return] Health not alive other={other.name} hp={health.CurrentHP}"); + return; + } _hitTargets.Add(other); // 유효 대미지 산출 (balance/01 v0.2 §3 공식 — ActiveSkillRuntime.CalculateEffectiveDamage()) int damage = _runtime.CalculateEffectiveDamage(); + Debug.Log($"[Projectile][Hit] other={other.name} damage={damage}"); // 피해 적용 health.Decrement(damage);