BT5-Dev #41: PrepareToJump 즉시 mask OFF + jumpState=Jumping 영역 ascending 판정

PD 보고: 여전히 발판 통과 X (BT40 적용 정합이지만 동작 X)

진단:
- PrepareToJump frame: velocity.y = 0 (ComputeVelocity 영역 영역 영역 적용 X) → ascending=false → mask Layer 16 ON → body.Cast 발판 영역 충돌 → 영역 frame 영역 영역
- 다음 frame: velocity.y > 0 → mask OFF → 통과. 그러나 이미 영역 frame 영역 영역 영역

정정:
- PrepareToJump case 영역 영역 즉시 contactFilter mask Layer 16 OFF (frame 지연 차단)
- UpdateContactFilterForDropThrough: ascending = velocity.y > 0.01 || jumpState == Jumping (jumpState 영역 영역 영역 영역 영역 정합)

영역 frame 영역 PrepareToJump → Jumping 영역 영역 영역 mask 영역 OFF 유지 → body.Cast 영역 영역 영역 영역 영역
This commit is contained in:
깃 관리자 2026-05-07 18:23:46 +09:00
parent a6e0c0d56d
commit b6baec20de
1 changed files with 8 additions and 1 deletions

View File

@ -170,6 +170,12 @@ namespace Platformer.Mechanics
jumpState = JumpState.Jumping; jumpState = JumpState.Jumping;
jump = true; jump = true;
stopJump = false; stopJump = false;
// BT41 — PrepareToJump frame 영역 즉시 contactFilter Layer 16 mask OFF (다음 ComputeVelocity 영역 velocity.y 적용 영역 영역 frame 영역 발판 영역 충돌 차단)
{
int baseMaskJump = Physics2D.GetLayerCollisionMask(gameObject.layer);
contactFilter.SetLayerMask(baseMaskJump & ~(1 << JUMP_THROUGH_LAYER));
contactFilter.useLayerMask = true;
}
break; break;
case JumpState.Jumping: case JumpState.Jumping:
if (!IsGrounded) if (!IsGrounded)
@ -197,7 +203,8 @@ namespace Platformer.Mechanics
void UpdateContactFilterForDropThrough() void UpdateContactFilterForDropThrough()
{ {
int baseMask = Physics2D.GetLayerCollisionMask(gameObject.layer); int baseMask = Physics2D.GetLayerCollisionMask(gameObject.layer);
bool ascending = velocity.y > 0.01f; // 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; int mask = ascending ? (baseMask & ~(1 << JUMP_THROUGH_LAYER)) : baseMask;
contactFilter.SetLayerMask(mask); contactFilter.SetLayerMask(mask);
contactFilter.useLayerMask = true; contactFilter.useLayerMask = true;