From 900affb5c532a9b1af82db4870b9f161ff76caae Mon Sep 17 00:00:00 2001 From: swrring Date: Thu, 7 May 2026 17:57:30 +0900 Subject: [PATCH] =?UTF-8?q?BT5-Dev=20#35:=20=EC=A0=90=ED=94=84=20=EC=B8=A1?= =?UTF-8?q?=EB=A9=B4=20=ED=94=BC=ED=95=B4=20=EB=B0=A9=EC=96=B4=20+=20Tilem?= =?UTF-8?q?ap+CompositeCollider2D+Rigidbody2D=20Static+PlatformEffector2D?= =?UTF-8?q?=20=ED=91=9C=EC=A4=80=20=ED=8C=A8=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../Scripts/Gameplay/PlayerEnemyCollision.cs | 9 +++++- Assets/Scripts/Mechanics/GameOptimizer.cs | 30 ++++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Assets/Scripts/Gameplay/PlayerEnemyCollision.cs b/Assets/Scripts/Gameplay/PlayerEnemyCollision.cs index 1983881..3457d2b 100644 --- a/Assets/Scripts/Gameplay/PlayerEnemyCollision.cs +++ b/Assets/Scripts/Gameplay/PlayerEnemyCollision.cs @@ -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(); } diff --git a/Assets/Scripts/Mechanics/GameOptimizer.cs b/Assets/Scripts/Mechanics/GameOptimizer.cs index 75663b0..3d50858 100644 --- a/Assets/Scripts/Mechanics/GameOptimizer.cs +++ b/Assets/Scripts/Mechanics/GameOptimizer.cs @@ -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(); + if (tilemapCollider != null) + { + tilemapCollider.compositeOperation = Collider2D.CompositeOperation.Merge; + var composite = c.GetComponent(); + if (composite == null) composite = c.gameObject.AddComponent(); + var rb = c.GetComponent(); + if (rb == null) rb = c.gameObject.AddComponent(); + rb.bodyType = RigidbodyType2D.Static; + composite.usedByEffector = true; + var compositeEffector = c.GetComponent(); + if (compositeEffector == null) compositeEffector = c.gameObject.AddComponent(); + 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(); if (effector == null) effector = c.gameObject.AddComponent(); @@ -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)}]"); } } }