ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 화면 비율 고정 처리...3
    일지 2021. 9. 18. 18:20

    코루틴 사용 및 변경 처리 중 중복 변경 블록

    이전에 문제가 됐던 것을 확인하여 코루틴을 사용하도록 변경하고 화면 변경 중에는 다시 코루틴이 발동하지 않도록 처리했다.

     

    ResolutionController.cs

    using System;
    using System.Collections;
    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;
    
        private bool m_isChanging;
    
        void Start()
        {
            m_aspectRatio = AspectX / AspectY;
    
            m_screenSizeX = Screen.width;
            m_screenSizeY = Screen.height;
        }
    
        void Update()
        {
            if (m_isChanging)
    		{
                return;
    		}
    
            int newScreenSizeX = Screen.width;
            int newScreenSizeY = Screen.height;
    
            if (newScreenSizeX == m_screenSizeX && newScreenSizeY == m_screenSizeY)
            {
                return;
            }
    
            if (!Input.GetKeyUp(KeyCode.Mouse0))
            {
                return;
            }
    
            StartCoroutine(SetFixedResolution());
        }
    
        private IEnumerator SetFixedResolution()
    	{
            m_isChanging = true;
    
            int newScreenSizeX = Screen.width;
            int newScreenSizeY = Screen.height;
    
            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);
    
            yield return null;
    
            m_isChanging = false;
        }
    }

     

    코루틴 사용 처리

     

    여기에서 문제를 발견했는데 유니티의 GetKeyUp은 유니티 게임 창 내부만 감지하기 때문에 크기 변경 후 화면 내부를 한 번 눌러 줘야 한다는 치명적인 문제가 있었다.

     

    추가적으로 SetResolution 실행 후 화면이 가운데로 이동한다는 문제도 존재한다.

     

    그러나 유니티 자체에서 지원하는 기능은 존재하지 않는 것으로 보이며 이를 해결하기 위해서는 WinAPI를 사용하여 마우스 상태를 직접 가져오고 유니티 게임 창을 원하는 위치로 옮겨주는 처리가 필요할 것으로 보인다.

     

    댓글

Designed by Tistory.