모바일 유니티 프로젝트를 진행하다가 실제 기기에서 테스트를 하다보면
대부분의 확률로 해상도 문제에 다다르게 되는데요.
이 해상도 문제를 프로젝트 진행 중 발견하게되면 해결을 해도 이미 제작중인 기능들에 대한 테스트를 해야 한다던가 UI의 문제가 생기기 쉽기 때문에 개발 초기단계에서 타겟 해상도를 지정한 뒤, 나머지 해상도들에 대한 지원을 미리 해두어야합니다.
이 글은 해상도 문제에 대해 다룹니다.
화면 해상도 고정
실행되는 기기의 해상도를 타겟 해상도로 고정시키는 방법입니다.
가장 쉬운 방법이지만, 보통 이 방법으로 잘 해결되지 않는데요.
이 기능이 작동하지 않는 기기가 많기 때문입니다.
카메라 ViewPort 설정(레터박스)
유니티의 카메라 컴포넌트를 보면 ViewPort라는 것이 있는데, ViewPort는 각 요소에서 0~1의 값을 가지고, 카메라를 스크린에 그려줄 박스크기 및 위치를 조절하는 것입니다.
이 크기를 조절하여 원하는 해상도로 박스를 만들고, 나머지 빈공간은 검은색으로 아무것도 그려지지 않게 하는 방법이 있습니다.
X = 렌더링이 시작될 위치의 x좌표, Y = 렌더링이 시작될 위치의 y좌표
W,H = 렌더링될 박스가 스크린에서 차지하는 비율(1=스크린 전체)(각각 가로, 세로)
타겟해상도/현재해상도를 통해 W,H를 구하고, W,H에 맞춰 중앙으로 정렬 시켜줍니다.
다음과 같은 코드를 씬의 시작과 함께 실행시켜줍니다.
void ResolutionFix()
{
float targetWidthAspect = 9.0f;
float targetHeightAspect = 16.0f;
float targetWidthAspectPort = targetWidthAspect / targetHeightAspect;
float targetHeightAspectPort = targetHeightAspect / targetWidthAspect;
float currentWidthAspectPort = (float)Screen.width / (float)Screen.height;
float currentHeightAspectPort = (float)Screen.height / (float)Screen.width;
float viewPortW = targetWidthAspectPort / currentWidthAspectPort;
float viewPortH = targetHeightAspectPort / currentHeightAspectPort;
if (viewPortH > 1)
viewPortH = 1;
if (viewPortW > 1)
viewPortW = 1;
Camera.main.rect = new Rect(
(1-viewPortW)/2,
(1 - viewPortH) / 2,
viewPortW,
viewPortH);
}
주의 해야할 점은, Screen클래스의 width와 height는 int형이기 때문에 그냥 나누면 소수점 자리가 없이 나오기 때문에 원하는 값이 나오지 않을 수 있습니다.
사진과 같이 위 아래로 레터박스가 생겨 타겟 해상도가 아닌 기기에도 실행 할 수 있게 되었습니다.
카메라 Size 설정
2D 카메라에 있는 설정인데, 커질 수록 화면이 넓어집니다.
(타겟 해상도 높이/2) / (pixel per unit)
값으로 설정합니다.
이 3가지 방법을 모두 적용하면 어느정도 해상도 대응을 할 수 있게 됩니다.
하지만 이는 카메라에 대한 해상도 설정이었으며, UI를 다룰 때 또 다시 문제가 생깁니다.
그 해법은 다음 글에서 다루도록 하겠습니다.
'참고 사항(게임개발) > 유니티' 카테고리의 다른 글
[유니티 커스텀 에디터] 2D Animation Creator - 2 (0) | 2020.09.11 |
---|---|
[유니티2D 물리] 움직이는 물체가 서로 밀리지 않게 하기 (1) | 2020.06.10 |
[유니티 커스텀 에디터] 2D Animation Creator (0) | 2020.05.14 |