From ddc0e250e5636e77f42020a27abc1ff2e52d6350 Mon Sep 17 00:00:00 2001 From: swrring Date: Tue, 12 May 2026 11:24:42 +0900 Subject: [PATCH] =?UTF-8?q?fix(BT12-Dev):=20Player=20=E2=86=94=20Enemy=20?= =?UTF-8?q?=EB=8B=BF=EC=9D=8C=20=EC=8B=9C=20=ED=94=BC=ED=95=B4=20=EB=B3=B5?= =?UTF-8?q?=EC=9B=90=20(=EC=A7=80=EC=83=81=EB=A7=8C=C2=B7=EC=A0=90?= =?UTF-8?q?=ED=94=84=20=ED=86=B5=EA=B3=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD: "Enemy 닿으면 Player 피해 (밟기는 X·통과)" 근본: - 직전 commit adcb1ac에서 Player↔Enemy 충돌 검출 자체 폐기 - Player 피해 경로 부재 → 복원 필요·단 밟기는 X fix (EnemyController.Update): - _cachedPlayer 캐싱 (Tag·fallback) - Player.IsGrounded && VisualBounds.Intersects(Player.Bounds) → !IsInvulnerable 시 Player.health.Decrement (i-frame 적용) - 공중 (점프) 상태는 통과·밟기 판정 X·EnemyDeath·Bounce X 회귀 영역 X: - Enemy 사망 경로: Player 공격(Projectile·AttackHitbox)만 정합 - Player ↔ Enemy IgnoreCollision Awake 적용 정합·물리 통과 - Enemy ↔ Enemy IgnoreLayerCollision·발판 통과·scale·patrol 정합 Co-Authored-By: Claude Opus 4.7 (1M context) --- Assets/Scripts/Mechanics/EnemyController.cs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/Mechanics/EnemyController.cs b/Assets/Scripts/Mechanics/EnemyController.cs index 4f44ae2..953ecdb 100644 --- a/Assets/Scripts/Mechanics/EnemyController.cs +++ b/Assets/Scripts/Mechanics/EnemyController.cs @@ -373,8 +373,27 @@ namespace Platformer.Mechanics if (control != null) control.move.x = 0f; } - // BT12-Dev 2026-05-11 — 밟기 공격 폐기 (PD 지시): Player ↔ Enemy 충돌 검출·PlayerEnemyCollision 발화 제거. + // BT12-Dev 2026-05-11 — 밟기 공격 폐기 (PD 지시): PlayerEnemyCollision 발화 제거. // Player ↔ Enemy IgnoreCollision은 Awake 시점에 이미 적용되어 물리 통과 정합. + // + // PD 지시 2026-05-11 — Player ↔ Enemy 닿음 시 Player 피해 (밟기는 X·통과). + // Player IsGrounded 상태에서만 피격·공중(점프) 상태는 통과. + if (_cachedPlayer == null) + { + var pgo = GameObject.FindGameObjectWithTag("Player"); + if (pgo != null) _cachedPlayer = pgo.GetComponent(); + if (_cachedPlayer == null) _cachedPlayer = Object.FindFirstObjectByType(); + } + if (_cachedPlayer != null && _cachedPlayer.health != null && _cachedPlayer.health.IsAlive) + { + if (_cachedPlayer.IsGrounded && VisualBounds.Intersects(_cachedPlayer.Bounds)) + { + if (!_cachedPlayer.health.IsInvulnerable) + { + _cachedPlayer.health.Decrement(); + } + } + } } void OnDrawGizmos()