일지

유니티 화면 비율 고정 처리...2

niamdank 2021. 9. 17. 21:17

특정 비율 고정 처리 구현

유니티의 Update 에서 화면 비율이 바뀐 것을 확인하여 변경 처리하도록 구현한다.

 

ResolutionController.cs

using System;
using UnityEngine;

public class ResolutionController : MonoBehaviour
{
    public float AspectX { get; set; } = 16;
    public float AspectY { get; set; } = 9;

    private float m_aspectRatio;

    private int m_screenSizeX;
    private int m_screenSizeY;

    void Start()
    {
        m_aspectRatio = AspectX / AspectY;

        m_screenSizeX = Screen.width;
        m_screenSizeY = Screen.height;
    }

    void Update()
    {
        int newScreenSizeX = Screen.width;
        int newScreenSizeY = Screen.height;

        if (newScreenSizeX == m_screenSizeX && newScreenSizeY == m_screenSizeY)
        {
            return;
        }

        if (Input.GetKey(KeyCode.Mouse0))
        {
            return;
        }

        if (newScreenSizeX != m_screenSizeX && newScreenSizeY != m_screenSizeY)
        {
            if (Math.Abs(newScreenSizeX - m_screenSizeX) > Math.Abs(newScreenSizeY - m_screenSizeY))
            {
                newScreenSizeY = Mathf.FloorToInt(newScreenSizeX / m_aspectRatio);
            }
            else
            {
                newScreenSizeX = Mathf.FloorToInt(newScreenSizeY * m_aspectRatio);
            }
        }
        else if (newScreenSizeX != m_screenSizeX)
        {
            newScreenSizeY = Mathf.FloorToInt(newScreenSizeX / m_aspectRatio);
        }
        else if (newScreenSizeY != m_screenSizeY)
        {
            newScreenSizeX = Mathf.FloorToInt(newScreenSizeY * m_aspectRatio);
        }

        m_screenSizeX = (int)newScreenSizeX;
        m_screenSizeY = (int)newScreenSizeY;

        Screen.SetResolution(m_screenSizeX, m_screenSizeY, false);
    }
}

 

실행 결과

 

위와 같이 화면 정렬 중 튀는 문제가 발생했다.

이를 해결하기 위해 우선 처리를 IEnumerator 로 분리하고 플래그로 중간에 더 바뀌지 않도록 막을 필요가 있어 보인다.