diff --git a/Assets/Scripts/Mechanics/GameOptimizer.cs b/Assets/Scripts/Mechanics/GameOptimizer.cs index 32bbd28..a6a9f1d 100644 --- a/Assets/Scripts/Mechanics/GameOptimizer.cs +++ b/Assets/Scripts/Mechanics/GameOptimizer.cs @@ -102,13 +102,20 @@ namespace Platformer.Mechanics { var pos = new Vector3Int(x, y, 0); if (!levelTilemap.HasTile(pos)) continue; + + // BT49 — Tile asset의 m_ColliderType=None = 배경 의도 (예: tree·cloud) = 자동 분류 제외 + var tileAsset = levelTilemap.GetTile(pos); + if (tileAsset != null && tileAsset.colliderType == UnityEngine.Tilemaps.Tile.ColliderType.None) continue; + Vector3 worldPos = levelTilemap.CellToWorld(pos); bool aboveThreshold = worldPos.y >= airThresholdY; bool isSmallAir = !aboveThreshold && IsSmallAirPlatform(levelTilemap, pos, MAX_PLATFORM_WIDTH); if (!aboveThreshold && !isSmallAir) continue; var tile = levelTilemap.GetTile(pos); + // BT49 — Foreground 이동 시 Tile asset 원래 colliderType 존중 (None=배경, Sprite=발판) + var srcColliderType = (tileAsset != null) ? tileAsset.colliderType : UnityEngine.Tilemaps.Tile.ColliderType.Sprite; fgTilemap.SetTile(pos, tile); - fgTilemap.SetColliderType(pos, UnityEngine.Tilemaps.Tile.ColliderType.Sprite); + fgTilemap.SetColliderType(pos, srcColliderType); levelTilemap.SetTile(pos, null); if (aboveThreshold) movedHigh++; else movedSmall++; @@ -121,6 +128,31 @@ namespace Platformer.Mechanics } } + // BT49 — Foreground Tilemap 자체에 이미 그려진 배경 Tile (예: tree·cloud — Tile asset colliderType=None) ColliderType=None 복원 + // BT47이 SetColliderType(Sprite) 무차별 강제 → 배경 Tile도 발판처럼 충돌 → Tile asset metadata 존중으로 정정 + if (fgTilemap != null && fgTc != null) + { + int restored = 0; + var fgBounds = fgTilemap.cellBounds; + for (int x = fgBounds.xMin; x <= fgBounds.xMax; x++) + { + for (int y = fgBounds.yMin; y <= fgBounds.yMax; y++) + { + var pos = new Vector3Int(x, y, 0); + if (!fgTilemap.HasTile(pos)) continue; + var fgTileAsset = fgTilemap.GetTile(pos); + if (fgTileAsset == null) continue; + if (fgTileAsset.colliderType == UnityEngine.Tilemaps.Tile.ColliderType.None) + { + fgTilemap.SetColliderType(pos, UnityEngine.Tilemaps.Tile.ColliderType.None); + restored++; + } + } + } + if (restored > 0) fgTc.ProcessTilemapChanges(); + Debug.Log($"[BT49-Background] Foreground tile colliderType=None restored: {restored} (배경 Tile 충돌 차단)"); + } + Debug.Log($"[BT48-DropThrough] Layer16 applied={applied} levelKeptLayer0={levelKept} excluded={excluded} total={allColliders.Length}"); Debug.Log($"[BT48-DropThrough] appliedSamples=[{string.Join(", ", appliedNames)}]"); }