일지

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

niamdank 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로 막는 부분을 제거해야 하는데 이렇게 될 경우 최대 크기와 창의 비율에 따른 최대화 시 크기가 동일한 경우 무한히 해당 루프를 타게 되는 문제가 있다.

이를 막기 위해 고민을 해봐야 할 것 같다.