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:
parent
900affb5c5
commit
7de7025648
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue