diff --git a/Assets/Scripts/Mechanics/PlayerController.cs b/Assets/Scripts/Mechanics/PlayerController.cs index ebd0c06..d570458 100644 --- a/Assets/Scripts/Mechanics/PlayerController.cs +++ b/Assets/Scripts/Mechanics/PlayerController.cs @@ -263,6 +263,18 @@ namespace Platformer.Mechanics RaycastHit2D footHitL = Physics2D.Raycast(new Vector2(boundsLeft, footY), Vector2.down, 0.1f, jumpThroughMask); RaycastHit2D footHitR = Physics2D.Raycast(new Vector2(boundsRight, footY), Vector2.down, 0.1f, jumpThroughMask); standingOnPlatform = footHitC.collider != null || footHitL.collider != null || footHitR.collider != null; + + // BT74 — 밀림 상태 강제 Drop-Through (PD 권고 2026-05-08: "한번이라도 밀리면 아래로 강제로 떨구어야") + // 점프·낙하 중 정점 영역(velocity.y > -1.5) + 수평 입력 + 발판 가장자리 일시 검출 = 밀림 상태 + // → dropThroughTimer 강제 활성 + standingOnPlatform=false 즉시 해제 + bool inAir = jumpState == JumpState.Jumping || jumpState == JumpState.InFlight; + bool nearApex = velocity.y > -1.5f; + bool horizontalIntent = Mathf.Abs(move.x) > 0.1f; + if (standingOnPlatform && inAir && nearApex && horizontalIntent) + { + dropThroughTimer = DROP_THROUGH_DURATION; + standingOnPlatform = false; + } } // standingOnPlatform=true → Layer 16 ON (착지·서있는 영역 영역 X) / 그 외 → Layer 16 OFF (통과)