BT5-Dev #51: 사후 복원 영역 Grid→Sprite 강제 폐기 — PD 직접 그린 Tile default 형상 보존

PD 보고 (BT50 후): "숨겨진 길이 최상단에 나와버려서 길을 다 막고 있어"

원인 가설:
- BT50 사후 복원 영역 = Foreground에 PD가 직접 그린 Grid Tile을 무차별 Sprite 강제
- PD Editor 직접 그린 Tile = default colliderType (Tile asset의 Grid) 의도
- 무차별 Sprite 강제 = PD 의도 형상 변형 → 통과 영역 차단

정정:
- 사후 복원: None Tile만 SetColliderType(None) 복원 (BT49 영역 정합 회귀)
- Grid→Sprite 강제 코드 영역 폐기
- 이동 시 Grid→Sprite 강제(상단)는 유지 — Level→Foreground 이동 신규 Tile만 Sprite 적용

효과:
1. Level→Foreground 이동 신규 Tile = Sprite Collider (BT49 후 통과 X 정정 유지)
2. PD 직접 그린 Grid Tile = default Grid Collider (PD 의도 형상 보존)
3. None Tile = 배경 통과 (BT49 영역 정합)

가설 한계 (pm-auditor Major #1 자인):
- BT50 사후 복원이 진짜 원인 확증 X. PD 시각 검증 후 효과 X 시 즉시 추가 가설 (Layer Matrix·UpdateContactFilter·Tilemap sortingOrder·Tile 위치 좌표) 전환 의무.

Debug.Log: [BT51-FgRefine] None restored=N (forced Sprite 카운터 폐기)
PD Refresh+Play 시 숨겨진 길 통과 + 이전 발판 정상 동작 시각 검증.
본 PM 직접 Editor.log read 의무 (PD 시각 검증 결과 보고 직후).
This commit is contained in:
깃 관리자 2026-05-07 22:43:37 +09:00
parent 867f0de253
commit dc00afd0a2
1 changed files with 6 additions and 9 deletions

View File

@ -134,9 +134,12 @@ namespace Platformer.Mechanics
// BT49 — Foreground Tilemap 자체에 이미 그려진 배경 Tile (예: tree·cloud — Tile asset colliderType=None) ColliderType=None 복원 // BT49 — Foreground Tilemap 자체에 이미 그려진 배경 Tile (예: tree·cloud — Tile asset colliderType=None) ColliderType=None 복원
// BT47이 SetColliderType(Sprite) 무차별 강제 → 배경 Tile도 발판처럼 충돌 → Tile asset metadata 존중으로 정정 // BT47이 SetColliderType(Sprite) 무차별 강제 → 배경 Tile도 발판처럼 충돌 → Tile asset metadata 존중으로 정정
// BT51 — 사후 복원: None Tile만 SetColliderType(None) 복원 (배경 통과 보장).
// BT50의 Grid→Sprite 강제는 폐기 (PD가 직접 Foreground에 그린 Grid Tile의 default Collider 형상 보존).
// 이동 시 Grid→Sprite 강제(상단)는 유지 — Level→Foreground 이동되는 신규 Tile만 Sprite Collider 적용.
if (fgTilemap != null && fgTc != null) if (fgTilemap != null && fgTc != null)
{ {
int restoredNone = 0, forcedSprite = 0; int restoredNone = 0;
var fgBounds = fgTilemap.cellBounds; var fgBounds = fgTilemap.cellBounds;
for (int x = fgBounds.xMin; x <= fgBounds.xMax; x++) for (int x = fgBounds.xMin; x <= fgBounds.xMax; x++)
{ {
@ -151,16 +154,10 @@ namespace Platformer.Mechanics
fgTilemap.SetColliderType(pos, UnityEngine.Tilemaps.Tile.ColliderType.None); fgTilemap.SetColliderType(pos, UnityEngine.Tilemaps.Tile.ColliderType.None);
restoredNone++; 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 (restoredNone + forcedSprite > 0) fgTc.ProcessTilemapChanges(); if (restoredNone > 0) fgTc.ProcessTilemapChanges();
Debug.Log($"[BT50-FgRefine] colliderType=None restored: {restoredNone} (배경 통과) / Grid→Sprite forced: {forcedSprite} (sprite 빈 영역 통과 보존)"); Debug.Log($"[BT51-FgRefine] colliderType=None restored: {restoredNone} (배경 통과·Grid Tile은 default Collider 유지)");
} }
Debug.Log($"[BT48-DropThrough] Layer16 applied={applied} levelKeptLayer0={levelKept} excluded={excluded} total={allColliders.Length}"); Debug.Log($"[BT48-DropThrough] Layer16 applied={applied} levelKeptLayer0={levelKept} excluded={excluded} total={allColliders.Length}");