프로그래밍/유니티

[유니티] 해상도 고정 & 빈 공간 처리

갓똥 2022. 11. 18. 01:42
728x90
반응형

1. 해상도 고정

원하는 해상도는 아래 코드에 width, height에 놓으면 된다.

void Awake()
{
    Screen.sleepTimeout = SleepTimeout.NeverSleep;

    int width = 1080;
    int height = 1920;
    float res = (float)width / height;

    int deviceWidth = Screen.width;
    int deviceHeight = Screen.height;
    float deviceRes = (float)deviceWidth / deviceHeight;

    // SetResolution 함수 제대로 사용하기
    Screen.SetResolution(width, (int)(((float)deviceHeight / deviceWidth) * width), true);

    if (res < deviceRes)
    {
        // 기기의 해상도 비가 더 큰 경우
        float newWidth = res / deviceRes;
        Camera.main.rect = new Rect((1f - newWidth) / 2f, 0f, newWidth, 1f);
    }
    else
    {
        // 게임의 해상도 비가 더 큰 경우
        float newHeight = deviceRes / res;
        Camera.main.rect = new Rect(0f, (1f - newHeight) / 2f, 1f, newHeight);
    }
}

GameManager에 넣고 쓰면 된다.

쓰게 되면

위 화면은 simulator에 노트10+인데 구글링해보니 19:9 비율의 3040 x 1440이다.

이걸 강제로 9:16으로 바꿔보자.

 

요렇게 된다.

Canvas의 Render Mode는 Screen Space - Camera를 사용해야 한다.\

지금은 위아래 영역이 검은색이지만 잔상이 남을 수 있는데 그럴 때는

private void OnPreCull()
{
    GL.Clear(true, true, Color.black);
}

해당 코드를 추가해서 해결할 수 있다.

혹은 위 아래 덮는 이미지나 다른 색상으로 덮을 수도 있다.

 


2. 빈 공간 처리

#region CoverImage
[Header("[Cover]")]
public RectTransform topCover;
public RectTransform bottomCover;

private void CoverInit()
{
    var rect = Camera.main.rect;

    topCover.anchorMin = new Vector2(0f, 1f - rect.y);
    topCover.anchorMax = Vector2.one;
    topCover.anchoredPosition = Vector2.zero;

    bottomCover.anchorMin = Vector2.zero;
    bottomCover.anchorMax = new Vector2(1f, rect.y);
    bottomCover.anchoredPosition = Vector2.zero;
}
#endregion

위 아래 검은색 영역은 해당 코드로 덮을 수 있다.

728x90
반응형