-
유니티 화면 비율 고정 처리...25일지 2021. 12. 22. 15:12
최대화 처리
최대화 처리를 위해 작업표시줄 등을 제외한 창의 순수한 크기를 구해준다.
// 윈도우 창 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에서 최대화가 된 경우를 감지하여 최대화 처리를 진행한다.
이때, 최대화 이후 버그를 막기 위해 Margin 값을 주어 창화면이 유지되도록 한다.
private bool Maximized { get { return Screen.width >= m_maximizedSizeX || Screen.height >= m_maximizedSizeY; } } if (!m_maximized && Maximized) { m_maximized = true; StopAllCoroutines(); m_updateState = UpdateState.Waiting; int width = m_maximizedSizeX; int height = m_maximizedSizeY - MaximizeMargin; GetAdjustedSize(ref width, ref height, ResizeOption.Horizontal); Screen.SetResolution(width, height, false); m_screenSizeX = width; m_screenSizeY = height; } if (!Maximized) { m_maximized = false; }
이제 마지막으로 윈도우의 Areo 기능으로 화면 가장자리로 이동해서 크기가 달라졌을 때 처리만 추가하면 크기 조정 처리를 마무리할 수 있을 것 같다.
2022-09-05 추가)
최근 이 부분 조회수가 늘어서 추가하자면 현재 진행된 코드는 깃에 올라가 있다.
관심 갖고 있는 분야가 좀 달라져서 진행을 안 하고 있어서 정확히 어디까지 했었는지 기억은 안 나지만 없는 것보다는 도움이 될 것이다.
NadanKim/UnityCustomTools: 유니티에서 사용할 수 있는 툴의 개발 및 저장을 위한 저장소 (github.com)
추가로 내가 참고한 코드는 다음과 같다.