From 4fd9369139b5c97cd8a3cf5acd65607f1ac435f1 Mon Sep 17 00:00:00 2001 From: swrring Date: Thu, 7 May 2026 17:15:57 +0900 Subject: [PATCH] =?UTF-8?q?BT5-Dev=20#29:=20=EC=9D=BC=EB=B0=98=20=EC=A7=80?= =?UTF-8?q?=EB=A9=B4=20Layer=200=20=EB=B3=B5=EC=9B=90=20+=20Foreground=20T?= =?UTF-8?q?ilemapCollider2D=20=EB=8F=99=EC=A0=81=20=EC=B6=94=EA=B0=80=20(P?= =?UTF-8?q?M=20=EC=9E=90=EC=9D=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD 보고: 게임 시작 시 Player 바닥으로 계속 떨어짐 — '점프 후 착지는 가능해야 한다고 했잖아' 본 PM 자인 (BT28 잘못): - 모든 Collider(TilemapCollider2D 포함) Layer 8 변환 = 일반 지면도 Layer 8 = 통과 = 떨어짐 - 표준 platformer 영역 = 일반 지면(Layer 0) + 발판(Layer 8) 분리 의무 정정: - TilemapCollider2D 제외 영역 복원 → Level Tilemap = Layer 0 = 일반 충돌 = 착지 정합 - Foreground GameObject(TilemapRenderer만·Collider 미부착) 영역에 TilemapCollider2D 동적 추가 + Layer 8 변환 → 발판 정합 동작: - Level Tilemap = 일반 지면 (Layer 0) = Player 정상 착지·이동 - Foreground Tilemap = 발판 (Layer 8) = 기본 통과 + Player 발 Raycast 시 Drop-Through 착지 - 별개 BoxCollider2D(Alien 등) = Layer 8 = 발판 정합 --- Assets/Scripts/Mechanics/GameOptimizer.cs | 31 ++++++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/Assets/Scripts/Mechanics/GameOptimizer.cs b/Assets/Scripts/Mechanics/GameOptimizer.cs index 9541234..e4eac11 100644 --- a/Assets/Scripts/Mechanics/GameOptimizer.cs +++ b/Assets/Scripts/Mechanics/GameOptimizer.cs @@ -31,8 +31,8 @@ namespace Platformer.Mechanics [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] static void SetupJumpThroughPlatforms() { - // BT5-Dev #28 — Tilemap 영역 포함 모든 일반 Collider Layer 8 변환. - // Drop-Through 표준 패턴 = 모든 발판·지면이 Layer 8. PlatformDropThrough Raycast가 하강 시 충돌 활성 = 착지. + // BT5-Dev #29 — 일반 지면 Tilemap 일반 충돌 복원 + Foreground 발판만 Layer 8. + // 일반 지면(Level TilemapCollider2D) = Layer 0 = 착지 정합 / 발판(Foreground·별개 BoxCollider) = Layer 8 = Drop-Through int applied = 0, excluded = 0; var allColliders = Object.FindObjectsByType(FindObjectsSortMode.None); var appliedNames = new System.Collections.Generic.List(); @@ -40,6 +40,8 @@ namespace Platformer.Mechanics { if (c == null) continue; if (c.isTrigger) { excluded++; continue; } + // 일반 지면 Tilemap 제외 (Layer 0 정상 충돌) + if (c.GetComponent() != null) { excluded++; continue; } if (c.GetComponent() != null || c.GetComponent() != null || c.GetComponent() != null @@ -51,18 +53,33 @@ namespace Platformer.Mechanics continue; } - // PlatformEffector2D 잔존 제거 (BT25 누적 영향 차단) var effector = c.GetComponent(); if (effector != null) Object.Destroy(effector); c.usedByEffector = false; - - // Layer 8 변환 → IgnoreLayerCollision 기본 통과 + PlatformDropThrough Raycast 착지 c.gameObject.layer = 8; applied++; if (appliedNames.Count < 8) appliedNames.Add($"{c.gameObject.name}({c.GetType().Name})"); } - Debug.Log($"[BT28-JumpThrough] applied={applied} excluded={excluded} total={allColliders.Length}"); - Debug.Log($"[BT28-JumpThrough] appliedSamples=[{string.Join(", ", appliedNames)}]"); + + // BT29 — Foreground GameObject(TilemapRenderer만 부착·Collider 미부착)에 TilemapCollider2D 동적 추가 + Layer 8 + var foreground = GameObject.Find("Foreground"); + if (foreground != null) + { + var fgTc = foreground.GetComponent(); + if (fgTc == null) + { + fgTc = foreground.AddComponent(); + } + foreground.layer = 8; + Debug.Log($"[BT29-Foreground] TilemapCollider2D added·Layer 8 applied to '{foreground.name}'"); + } + else + { + Debug.Log($"[BT29-Foreground] 'Foreground' GameObject not found"); + } + + Debug.Log($"[BT29-JumpThrough] applied={applied} excluded={excluded} total={allColliders.Length}"); + Debug.Log($"[BT29-JumpThrough] appliedSamples=[{string.Join(", ", appliedNames)}]"); } } }