유니티 모바일 화면 해상도 솔루션

모바일 유니티 프로젝트를 진행하다가 실제 기기에서 테스트를 하다보면

대부분의 확률로 해상도 문제에 다다르게 되는데요.

이 해상도 문제를 프로젝트 진행 중 발견하게되면 해결을 해도 이미 제작중인 기능들에 대한 테스트를 해야 한다던가 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를 다룰 때 또 다시 문제가 생깁니다.

그 해법은 다음 글에서 다루도록 하겠습니다.