From 9adfc6462538fb12949ceeffad3a2b60687af80c Mon Sep 17 00:00:00 2001 From: swrring Date: Thu, 7 May 2026 21:47:56 +0900 Subject: [PATCH] =?UTF-8?q?BT5-Dev=20#49:=20=EB=B0=B0=EA=B2=BD=20Tile=20(t?= =?UTF-8?q?ree=C2=B7cloud)=20=EC=B6=A9=EB=8F=8C=20=EC=B0=A8=EB=8B=A8=20?= =?UTF-8?q?=E2=80=94=20Tile=20asset=20m=5FColliderType=20=EC=A1=B4?= =?UTF-8?q?=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 근본 원인: - BT47 line 106 `SetColliderType(pos, Sprite)` 무차별 강제 - tree.asset `m_ColliderType: 0` (None — 배경 의도) 무시 → 발판처럼 충돌 표준 패턴 정정 (3종 결합): 1. 분류 단계: Tile asset이 ColliderType.None = Foreground 이동 차단 (Level 잔존) 2. Foreground 이동 시: Tile asset 원래 colliderType 존중 (None=배경 / Sprite=발판) 3. Foreground 사후 복원: 이미 그려진 None Tile = SetColliderType(None) + ProcessTilemapChanges Tile asset m_ColliderType 메타데이터 = 충돌 의도 SOT. - m_ColliderType: 0 (None) = 배경 (충돌 X · 통과) - m_ColliderType: 2 (Sprite) = 발판/지형 (충돌 ON) 발판 의도 Tile은 m_ColliderType=Sprite 명시 필수. 후속 점검 권고: 모든 Tile asset의 m_ColliderType 일제 검토 (PD 디자인 의도 정합 검증). PD Refresh+Play 시 Console [BT49-Background] restored=N + 나무 통과 시각 검증. 본 PM 직접 Editor.log read 의무 (PD 시각 검증 결과 보고 직후). --- Assets/Scripts/Mechanics/GameOptimizer.cs | 34 ++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) 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)}]"); }