BT5-Dev #36: 충돌 감지 영역 Distance → Bounds.Intersects 표준 (PD 제안 채택)

PD 보고: 몬스터와 충돌 체크 X 통과 발생 — '충돌 로직 바꿔야'

자인:
- Distance 기반(hitRangeX=0.7, hitRangeY=1.0) = 빠른 통과 시 한 프레임 안 진입·이탈 = miss
- 표준 = Unity Physics Bounds.Intersects (AABB 정확)

정정:
- VisualBounds.Intersects(player.Bounds) — Enemy SpriteRenderer 영역 + Player Collider 영역 AABB 교차
- Layer 13↔14 OFF 영역 통과 가능 영역 그대로 (충돌 영역 무관)
- 시각 영역 보정(PLAYER_COLLIDER_TO_VISUAL_FOOT -0.17) 영역 그대로
- 빠른 통과 영역도 매 프레임 Bounds 교차 1회는 catch 정합

동작:
- Player가 Enemy 영역 통과 시 → Bounds 교차 시점 Schedule<PlayerEnemyCollision>
- 점프 상태(공중) 측면 → 피해 차단(BT35)
- 점프 후 머리 영역 → 밟기
This commit is contained in:
깃 관리자 2026-05-07 18:02:19 +09:00
parent 900affb5c5
commit 7de7025648
1 changed files with 8 additions and 10 deletions

View File

@ -108,20 +108,18 @@ namespace Platformer.Mechanics
} }
if (_cachedPlayer != null && _cachedPlayer.health != null && _cachedPlayer.health.IsAlive) if (_cachedPlayer != null && _cachedPlayer.health != null && _cachedPlayer.health.IsAlive)
{ {
// BT5-Dev #30 — 시각 영역 정합 보정: Player Collider 발(Bounds.min.y)이 시각 발보다 ~0.17 단위 위 (Offset y +0.10) // BT5-Dev #36 — Distance 영역 폐기 → Bounds.Intersects 표준 영역 (Unity Physics AABB 정확)
Vector3 ePos = transform.position; // Player 빠른 통과 시 한 프레임 catch 정합. Layer 13↔14 OFF 영역 통과 가능 영역 그대로.
Vector3 pPos = _cachedPlayer.transform.position; bool inRange = VisualBounds.Intersects(_cachedPlayer.Bounds);
float dx = Mathf.Abs(pPos.x - ePos.x);
const float PLAYER_COLLIDER_TO_VISUAL_FOOT = -0.17f; // Hero1 sprite 발 위치 보정
float footY = _cachedPlayer.Bounds.min.y + PLAYER_COLLIDER_TO_VISUAL_FOOT; // Player 시각 발
float headY = VisualBounds.max.y; // Enemy 시각 머리 (sprite 위 여백 ≈ 0)
float footHeadDelta = footY - headY; // 0 = 시각 발이 시각 머리 닿음
bool inRange = dx < hitRangeX && Mathf.Abs(pPos.y - ePos.y) < hitRangeY; const float PLAYER_COLLIDER_TO_VISUAL_FOOT = -0.17f;
float footY = _cachedPlayer.Bounds.min.y + PLAYER_COLLIDER_TO_VISUAL_FOOT;
float headY = VisualBounds.max.y;
float footHeadDelta = footY - headY;
if (inRange != _diagWasIntersecting) if (inRange != _diagWasIntersecting)
{ {
Debug.Log($"[EnemyDiag@{name}] inRange={inRange} footHeadDelta={footHeadDelta:F2} dx={dx:F2}"); Debug.Log($"[EnemyDiag@{name}] inRange={inRange} footHeadDelta={footHeadDelta:F2} VB={VisualBounds.size} PB={_cachedPlayer.Bounds.size}");
_diagWasIntersecting = inRange; _diagWasIntersecting = inRange;
} }