BT5-Dev #35: 점프 측면 피해 방어 + Tilemap+CompositeCollider2D+Rigidbody2D Static+PlatformEffector2D 표준 패턴

PD 보고:
1. 밟기 시 측면 피해 발생 — [PEC] delta=-1.15~-0.41 stomped=False pInvuln=True
2. 발판 통과 X 여전 — [BT34-OneWay] applied=2 [Alien, Level] 적용 정합이지만 동작 X

진단:
- TilemapCollider2D + PlatformEffector2D 단독 = Unity 영역 동작 X
- Unity 표준 = TilemapCollider2D(compositeOperation=Merge) + CompositeCollider2D + Rigidbody2D(Static) + PlatformEffector2D 4종 조합

정정:
- PlayerEnemyCollision: stomped=False + !player.IsGrounded → 점프 측면 피해 차단 (PD 지시 방어 코드)
- GameOptimizer: TilemapCollider2D 영역에 CompositeCollider2D·Rigidbody2D Static·PlatformEffector2D 4종 조합 적용

동작:
- Player 위에서 발판 떨어짐 → 충돌 (착지)
- Player 옆·아래·점프 상승 → 통과
- Enemy 측면 충돌 시 점프 상태이면 피해 X
This commit is contained in:
깃 관리자 2026-05-07 17:57:30 +09:00
parent cd60c71097
commit 900affb5c5
2 changed files with 34 additions and 5 deletions

View File

@ -48,7 +48,14 @@ namespace Platformer.Gameplay
return;
}
// 측면·아래 충돌 — i-frame 적용 피격
// BT5-Dev #35 — 점프 상태(공중) 측면 충돌 시 피해 X 방어 코드 (PD 지시)
if (!player.IsGrounded)
{
Debug.Log($"[PEC] 점프 상태 측면 충돌 영역 피해 차단 (delta={dyAtCollision:F2})");
return;
}
// 지상 상태 측면·아래 충돌 — i-frame 적용 피격
if (player.health.IsInvulnerable) return;
player.health.Decrement();
}

View File

@ -51,10 +51,32 @@ namespace Platformer.Mechanics
continue;
}
// BT34 — Layer 8 변환 폐기 (Layer 0 유지) + PlatformEffector2D 영역 OneWay 적용
// BT31 영역 잔존 Layer 8 영역 → Layer 0 복원
if (c.gameObject.layer == 8) c.gameObject.layer = 0;
// BT5-Dev #35 — TilemapCollider2D 영역 표준 패턴 (CompositeCollider2D + Rigidbody2D Static + PlatformEffector2D)
var tilemapCollider = c.GetComponent<UnityEngine.Tilemaps.TilemapCollider2D>();
if (tilemapCollider != null)
{
tilemapCollider.compositeOperation = Collider2D.CompositeOperation.Merge;
var composite = c.GetComponent<CompositeCollider2D>();
if (composite == null) composite = c.gameObject.AddComponent<CompositeCollider2D>();
var rb = c.GetComponent<Rigidbody2D>();
if (rb == null) rb = c.gameObject.AddComponent<Rigidbody2D>();
rb.bodyType = RigidbodyType2D.Static;
composite.usedByEffector = true;
var compositeEffector = c.GetComponent<PlatformEffector2D>();
if (compositeEffector == null) compositeEffector = c.gameObject.AddComponent<PlatformEffector2D>();
compositeEffector.useOneWay = true;
compositeEffector.surfaceArc = 180f;
compositeEffector.rotationalOffset = 0f;
compositeEffector.useSideFriction = false;
compositeEffector.useSideBounce = false;
applied++;
if (appliedNames.Count < 8) appliedNames.Add($"{c.gameObject.name}(Tilemap+Composite)");
continue;
}
// 일반 Collider — PlatformEffector2D 직접 적용
c.usedByEffector = true;
var effector = c.GetComponent<PlatformEffector2D>();
if (effector == null) effector = c.gameObject.AddComponent<PlatformEffector2D>();
@ -66,8 +88,8 @@ namespace Platformer.Mechanics
applied++;
if (appliedNames.Count < 8) appliedNames.Add($"{c.gameObject.name}({c.GetType().Name})");
}
Debug.Log($"[BT34-OneWay] applied={applied} excluded={excluded} total={allColliders.Length}");
Debug.Log($"[BT34-OneWay] appliedSamples=[{string.Join(", ", appliedNames)}]");
Debug.Log($"[BT35-OneWay] applied={applied} excluded={excluded} total={allColliders.Length}");
Debug.Log($"[BT35-OneWay] appliedSamples=[{string.Join(", ", appliedNames)}]");
}
}
}