BT5-Dev #42: 걷기·측면도 통과 (Player 발 raycast로 standingOnPlatform 판정)

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 → 다음 프레임 영역 영역 영역
This commit is contained in:
깃 관리자 2026-05-07 18:26:54 +09:00
parent b6baec20de
commit fc243453fe
1 changed files with 13 additions and 3 deletions

View File

@ -203,9 +203,19 @@ namespace Platformer.Mechanics
void UpdateContactFilterForDropThrough() void UpdateContactFilterForDropThrough()
{ {
int baseMask = Physics2D.GetLayerCollisionMask(gameObject.layer); int baseMask = Physics2D.GetLayerCollisionMask(gameObject.layer);
// BT41 — jumpState == Jumping 영역 영역 ascending true (PrepareToJump frame 직후 velocity.y 미반영 영역도 통과)
bool ascending = velocity.y > 0.01f || jumpState == JumpState.Jumping; // BT5-Dev #42 — PD 의도: 발판 위 착지(서있는) 영역만 충돌 ON, 걷기·점프·측면 영역 모두 통과
int mask = ascending ? (baseMask & ~(1 << JUMP_THROUGH_LAYER)) : baseMask; 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.SetLayerMask(mask);
contactFilter.useLayerMask = true; contactFilter.useLayerMask = true;
} }