diff --git a/Assets/Scripts/Mechanics/GameOptimizer.cs b/Assets/Scripts/Mechanics/GameOptimizer.cs index a6a9f1d..297311a 100644 --- a/Assets/Scripts/Mechanics/GameOptimizer.cs +++ b/Assets/Scripts/Mechanics/GameOptimizer.cs @@ -113,7 +113,11 @@ namespace Platformer.Mechanics if (!aboveThreshold && !isSmallAir) continue; var tile = levelTilemap.GetTile(pos); // BT49 — Foreground 이동 시 Tile asset 원래 colliderType 존중 (None=배경, Sprite=발판) + // BT50 — Grid (1) Tile은 Sprite (2)로 강제. 이전 BT47 호환 — Grid 사각형 Collider는 + // sprite 빈 픽셀 영역(두 레이어 겹친 숨겨진 길)을 차단 → Sprite 정확 Collider로 빈 영역 통과 보존 var srcColliderType = (tileAsset != null) ? tileAsset.colliderType : UnityEngine.Tilemaps.Tile.ColliderType.Sprite; + if (srcColliderType == UnityEngine.Tilemaps.Tile.ColliderType.Grid) + srcColliderType = UnityEngine.Tilemaps.Tile.ColliderType.Sprite; fgTilemap.SetTile(pos, tile); fgTilemap.SetColliderType(pos, srcColliderType); levelTilemap.SetTile(pos, null); @@ -132,7 +136,7 @@ namespace Platformer.Mechanics // BT47이 SetColliderType(Sprite) 무차별 강제 → 배경 Tile도 발판처럼 충돌 → Tile asset metadata 존중으로 정정 if (fgTilemap != null && fgTc != null) { - int restored = 0; + int restoredNone = 0, forcedSprite = 0; var fgBounds = fgTilemap.cellBounds; for (int x = fgBounds.xMin; x <= fgBounds.xMax; x++) { @@ -145,12 +149,18 @@ namespace Platformer.Mechanics if (fgTileAsset.colliderType == UnityEngine.Tilemaps.Tile.ColliderType.None) { fgTilemap.SetColliderType(pos, UnityEngine.Tilemaps.Tile.ColliderType.None); - restored++; + restoredNone++; + } + else if (fgTileAsset.colliderType == UnityEngine.Tilemaps.Tile.ColliderType.Grid) + { + // BT50 — Grid Tile은 Sprite로 강제 (이전 BT47 호환·sprite 빈 픽셀 영역 통과 보존) + fgTilemap.SetColliderType(pos, UnityEngine.Tilemaps.Tile.ColliderType.Sprite); + forcedSprite++; } } } - if (restored > 0) fgTc.ProcessTilemapChanges(); - Debug.Log($"[BT49-Background] Foreground tile colliderType=None restored: {restored} (배경 Tile 충돌 차단)"); + if (restoredNone + forcedSprite > 0) fgTc.ProcessTilemapChanges(); + Debug.Log($"[BT50-FgRefine] colliderType=None restored: {restoredNone} (배경 통과) / Grid→Sprite forced: {forcedSprite} (sprite 빈 영역 통과 보존)"); } Debug.Log($"[BT48-DropThrough] Layer16 applied={applied} levelKeptLayer0={levelKept} excluded={excluded} total={allColliders.Length}");