-
유니티 화면 비율 고정 처리...24일지 2021. 12. 14. 17:30
최대화 처리
최대화 처리를 위해 먼저 화면에서 사용할 수 없는 영역을 제외한 최대 크기를 알 수 있어야 한다.
이를 위해 윈도우 창의 border와 작업 표시줄의 크기를 가져와 해당 크기를 모니터의 사이즈에서 빼도록 한다.
// 윈도우 창 border 사이즈 RECT windowRect = new RECT(); RECT clientRect = new RECT(); GetWindowRect(m_hwnd, out windowRect); GetClientRect(m_hwnd, out clientRect); int windowBorderSizeX = (windowRect.Right - windowRect.Left) - (clientRect.Right - clientRect.Left); int windowBorderSizeY = (windowRect.Bottom - windowRect.Top) - (clientRect.Bottom - clientRect.Top); // 작업 표시줄 사이즈 RECT taskBarRect = new RECT(); IntPtr hTaskbar = FindWindow("Shell_TrayWnd", null); GetWindowRect(hTaskbar, out taskBarRect); int taskBarSizeX = Mathf.Abs(taskBarRect.Right - taskBarRect.Left); int taskBarSizeY = Mathf.Abs(taskBarRect.Bottom - taskBarRect.Top); // 작업 표시줄 위치 아래(위)인 경우 if (taskBarSizeX > taskBarSizeY) { taskBarSizeX = 0; } // 작업 표시줄 위치가 왼쪽(오른쪽)인 경우 else { taskBarSizeY = 0; } // 최대화 시 창 크기 m_maximizedSizeX = Display.main.systemWidth - windowBorderSizeX - taskBarSizeX; m_maximizedSizeY = Display.main.systemHeight - windowBorderSizeY - taskBarSizeY;
이후 Update에 최대화 시 처리를 추가한다.
if (!m_maximized && Maximized) { m_maximized = true; StopAllCoroutines(); int width = Display.main.systemWidth; int height = Display.main.systemHeight; GetAdjustedSize(ref width, ref height, ResizeOption.Horizontal); Screen.SetResolution(width, height, false); } if (!Maximized) { m_maximized = false; }
실행 결과는 다음과 같았다.
최초 처음으로 최대화를 한 경우 적절하게 처리가 되었으나 다시 최대화 버튼을 눌렀을 때 전체 화면으로 전환이 되는 것을 확인했다.
이를 해결하려면 Maximized 처리를 m_maximized로 막는 부분을 제거해야 하는데 이렇게 될 경우 최대 크기와 창의 비율에 따른 최대화 시 크기가 동일한 경우 무한히 해당 루프를 타게 되는 문제가 있다.
이를 막기 위해 고민을 해봐야 할 것 같다.