Unity / C#
Intermediate
Unity 2022.3+ / Unity 6
URP Pixel Perfect Camera 설정과 Cinemachine 2D 카메라 경계 가두기(Confiner2D)
픽셀 아트 게임의 텍셀 왜곡과 깜빡임(Shimmering)을 원천 차단하는 PPU 공식, Cinemachine Confiner2D를 활용한 맵 경계 밖 노출 방지 기법.
#Unity #2D #Cinemachine #PixelPerfect #URP #Camera
핵심 개념레트로 픽셀 아트 게임에서 카메라 줌이나 이동 시 도트가 1.5픽셀로 찌그러지거나 대각선이 울퉁불퉁 튀는 현상은 비정수 스케일링 때문에 일어납니다. URP의 Pixel Perfect Camera 컴포넌트를 올바르게 구성하고, Cinemachine Confiner2D를 결합하여 카메라가 레벨 맵의 빈 공간을 비추지 않도록 가두는 아키텍처를 소개합니다.
1. Pixel Perfect Camera 핵심 설정 공식
| 옵션 항목 | 권장값 (예: 320×180 타겟) | 설명 및 주의사항 |
|---|---|---|
| Assets Pixels Per Unit (PPU) | 16 (또는 32) | 프로젝트 내 모든 2D 스프라이트의 PPU 설정값과 100% 일치해야 함. |
| Reference Resolution | X: 320, Y: 180 (16:9) | 게임이 기준으로 삼을 논리적 레트로 네이티브 해상도. |
| Upscale Render Texture | 체크 (True) | 저해상도로 먼저 렌더링한 후 정수 배율로 디스플레이에 업스케일. |
| Pixel Snapping | 체크 (True) | 스프라이트 렌더러들을 서브픽셀 위치가 아닌 가장 가까운 정수 텍셀에 강제 스냅. |
| Crop Frame (X / Y) | Pillarbox / Letterbox | 모니터 비율이 16:9가 아닐 때 픽셀 비율을 보존하기 위해 레터박스 생성. |
2. Cinemachine Confiner2D 런타임 바운드 설정
using UnityEngine;
using Unity.Cinemachine; // Cinemachine v3 (Unity 6) / 구버전은 Cinemachine
public class CameraConfinerSetup : MonoBehaviour
{
[SerializeField] private CinemachineConfiner2D confiner;
[SerializeField] private PolygonCollider2D mapBoundary;
private void Start()
{
if (confiner != null && mapBoundary != null)
{
// 맵 경계 콜라이더 지정
confiner.BoundingShape2D = mapBoundary;
// 내부 버텍스 캐시 무효화 및 재계산
confiner.InvalidateBoundingShapeCache();
}
}
/// <summary>
/// 스테이지 전환 시 새로운 룸의 경계로 카메라 가둠 영역 교체
/// </summary>
public void SwitchRoomBoundary(PolygonCollider2D newRoomBounds)
{
mapBoundary = newRoomBounds;
confiner.BoundingShape2D = newRoomBounds;
confiner.InvalidateBoundingShapeCache();
}
}
3. 픽셀 아트 카메라 주의사항
- 스프라이트 안티앨리어싱 해제: 스프라이트 텍스처 임포트 시
Filter Mode를 반드시 Point (no filter)로 지정해야 흐릿한 바이리니어 블러 없이 선명한 도트가 유지됩니다. - 카메라 오소그래픽 사이즈 직접 수정 금지: Pixel Perfect Camera가 활성화되면
Camera.orthographicSize는 컴포넌트에 의해 매 프레임 자동으로 계산·잠금되므로, 스크립트에서 사이즈를 직접 수정하면 화면 떨림이 발생합니다.