사실 이전까지 UI 담당을 많이하긴했지만 UI는 부수적인 작업이었고, 병합이나 기획담당을 위주로 작업해왔습니다.
그래서 막상 빌드를 하게되면 UI가 깨지거나 해상도 대응이 안되는 일이 잦았습니다. 이를 한번 잡기 위해서 이번에도 UI 담당자를 자진해서 맡았고 가장 중요하게 생각하는 UI 해상도 대응, 고정에 대해서 공부해 보았습니다.
PC는 대부분 16:9 비율이 일반적이지만, 다양한 모니터와 창 크기 설정을 고려해 다음 해상도들을 대응하는 것이 좋습니다:
| 해상도 | 비율 | 설명 |
|---|---|---|
| 1920x1080 | 16:9 | FHD, 가장 일반적인 해상도 |
| 2560x1440 | 16:9 | QHD, 고해상도 모니터에서 사용 |
| 3840x2160 | 16:9 | 4K, 고사양 디스플레이 |
| 1600x900 | 16:9 | 저사양 환경 대응용 |
| 1280x720 | 16:9 | 최소 해상도 기준으로 적합 |
| 1280x1024 | 5:4 | 구형 모니터 대응 |
| 3440x1440 | 21:9 | 울트라 와이드 모니터 |
Camera.rect 값을 조정해 레터박스(Letterbox) 또는 필러박스(Pillarbox) 방식으로 검은 여백을 추가합니다.void UpdateCameraRect(Camera cam, float targetAspect = 16f / 9f)
{
float windowAspect = (float)Screen.width / Screen.height;
float scaleHeight = windowAspect / targetAspect;
if (scaleHeight < 1.0f)
{
cam.rect = new Rect(0, (1f - scaleHeight) / 2f, 1f, scaleHeight);
}
else
{
float scaleWidth = 1f / scaleHeight;
cam.rect = new Rect((1f - scaleWidth) / 2f, 0, scaleWidth, 1f);
}
}
Scale With Screen Size1920 x 1080 (기준 해상도 설정)Match Width Or Height
0.5추천 (가로/세로 균형)
| 해상도 | 비율 | 기기 예시 |
|---|---|---|
| 1080 x 1920 | 9:16 | 일반 세로형 스마트폰 |
| 1440 x 2560 | 9:16 | 고해상도 스마트폰 |
| 720 x 1280 | 9:16 | 저해상도 스마트폰 |
| 1125 x 2436 | 약 19.5:9 | iPhone X 시리즈 |
| 1080 x 2340 | 19.5:9 | 최신 안드로이드 기기 |
Scale With Screen Size1080 x 1920Height (1.0) 권장 (세로형 게임 기준)🔎 참고:
- 세로 기반 게임은
Height (1.0)- 가로 기반 게임은
Width (0.0)기준 설정
Screen.safeArea 값을 기준으로 UI 여백 조정Camera.rect 또는 비율 고정형 UI 배치 고려Screen.SetResolution()으로 해상도 테스트 가능 (PC)Application.platform으로 플랫폼별 분기 처리| 플랫폼 | 주요 고려사항 |
|---|---|
| PC | 다양한 창 크기 & 모니터 비율 대응, 레터박스 처리 |
| 모바일 | 세로/가로 고정 비율, Safe Area 고려, 해상도 대응 UI |
사실상 PC 에서는 모바일처럼 아주 독특한 환경은 없기 때문에 크게 신경쓸것이 없습니다. 하지만 모바일의 경우 노치와 같이 UI를 완전히 가리는 부분이 있어서 더 신경써 주어야 합니다.
특히 모바일에서는 UI 위치가 해상도에 따라 크게 변형되지 않도록 앵커,피벗, 스트래치를 잘 사용해주어야 합니다.
앵커는 부모(RectTransform) 기준으로 자식 UI 요소의 상대 위치를 결정합니다.
| 앵커 위치 | 설명 |
|---|---|
| 중앙 (0.5, 0.5) | 부모의 중심 기준 |
| 왼쪽 상단 (0, 1) | 부모의 좌상단 기준 |
| 스트레치 (Min ≠ Max) | 길이나 위치를 부모에 맞춰 자동 조정 |
피벗은 UI 요소 자체의 기준점입니다.
(0, 0)이면 왼쪽 아래를 기준으로 회전/스케일 조정(0.5, 0.5)이면 중심 기준앵커 Min과 Max가 다르면 스트레치 상태입니다.
anchoredPosition만 사용LayoutGroup, ContentSizeFitter와 함께 사용하면 효과적| 항목 | 기준 위치 | 용도 |
|---|---|---|
| Anchor | 부모 기준 | 위치 기준, 반응형 UI 배치 |
| Pivot | 자기 자신 기준 | 회전/스케일/이동 기준 |
| Stretch | 앵커 Min ≠ Max | 크기 자동 조정 |