From fc243453fe362ebed89a3dc5038cfe2951446579 Mon Sep 17 00:00:00 2001 From: swrring Date: Thu, 7 May 2026 18:26:54 +0900 Subject: [PATCH] =?UTF-8?q?BT5-Dev=20#42:=20=EA=B1=B7=EA=B8=B0=C2=B7?= =?UTF-8?q?=EC=B8=A1=EB=A9=B4=EB=8F=84=20=ED=86=B5=EA=B3=BC=20(Player=20?= =?UTF-8?q?=EB=B0=9C=20raycast=EB=A1=9C=20standingOnPlatform=20=ED=8C=90?= =?UTF-8?q?=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD 보고: 점프 통과 동작 + 추가 의도 — '바닥에 깔린 상태가 아니라 걸쳐져서 지나가는 상황' 해석: - 발판 위 착지(서있는) = 발판 영역 영역 X (정합) - 그 외 (걷기·옆에서 닿음·점프·하강) = 통과 정정: - UpdateContactFilterForDropThrough: Player 발 ↓ raycast(0.1m, Layer 16 mask) hit + IsGrounded → standingOnPlatform=true - standingOnPlatform=true → Layer 16 mask 영역 ON (발판 영역 영역 X = 영역 영역 영역) - 그 외 → Layer 16 mask OFF (걷기·점프·측면 모두 영역) PrepareToJump 즉시 mask OFF (BT41) 영역 그대로 — 점프 시작 frame 영역 발판 영역 영역 차단 동작: - 발판 위 정착 영역 = 영역 영역 ON = 안 떨어짐 - 발판 옆 걷기 영역 = footHit X 영역 OFF = 통과 - 점프 영역 영역 = IsGrounded=false 영역 standingOnPlatform=false → Layer 16 OFF = 통과 - 점프 후 발판 위 착지 = footHit + IsGrounded → standingOnPlatform=true → 다음 프레임 영역 영역 영역 --- Assets/Scripts/Mechanics/PlayerController.cs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Assets/Scripts/Mechanics/PlayerController.cs b/Assets/Scripts/Mechanics/PlayerController.cs index bbe07a5..93041fa 100644 --- a/Assets/Scripts/Mechanics/PlayerController.cs +++ b/Assets/Scripts/Mechanics/PlayerController.cs @@ -203,9 +203,19 @@ namespace Platformer.Mechanics void UpdateContactFilterForDropThrough() { int baseMask = Physics2D.GetLayerCollisionMask(gameObject.layer); - // BT41 — jumpState == Jumping 영역 영역 ascending true (PrepareToJump frame 직후 velocity.y 미반영 영역도 통과) - bool ascending = velocity.y > 0.01f || jumpState == JumpState.Jumping; - int mask = ascending ? (baseMask & ~(1 << JUMP_THROUGH_LAYER)) : baseMask; + + // BT5-Dev #42 — PD 의도: 발판 위 착지(서있는) 영역만 충돌 ON, 걷기·점프·측면 영역 모두 통과 + bool standingOnPlatform = false; + if (collider2d != null && IsGrounded) + { + Vector2 footPos = new Vector2(collider2d.bounds.center.x, collider2d.bounds.min.y + 0.02f); + int jumpThroughMask = 1 << JUMP_THROUGH_LAYER; + RaycastHit2D footHit = Physics2D.Raycast(footPos, Vector2.down, 0.1f, jumpThroughMask); + standingOnPlatform = footHit.collider != null; + } + + // standingOnPlatform=true → Layer 16 ON (착지·서있는 영역 영역 X) / 그 외 → Layer 16 OFF (통과) + int mask = standingOnPlatform ? baseMask : (baseMask & ~(1 << JUMP_THROUGH_LAYER)); contactFilter.SetLayerMask(mask); contactFilter.useLayerMask = true; }