はじめに

こんにちは、Unityエンジニアをやっている竹内です。
今回は、「Windows版のアプリ制作時に画面比率を維持したままウィンドウサイズを可変に対応する」という実装したことについてまとめました。

達成したい項目

  • 任意のサイズにウィンドウサイズをリサイズできるようにしたい
  • アスペクト比は維持したままリサイズさせたい
  • 最小、最大ウィンドウサイズを指定したい
  • 縦長のウィンドウなどがあるので最大化ボタンは押せないようにしたい
  • 上記全ての項目をスプラッシュスクリーン中も行いたい

サンプルプロジェクトのURL:
https://github.com/oTAMAKOo/Example-StandAloneWin 

任意のサイズにウィンドウサイズをリサイズできるようにしたい

この問題の対応は簡単です
Edit > Project Settings > Player > Resolution and Presentation
から下記の設定画面を開き次の設定に変更します。
  • 「Fullscreen Mode」を「Windowed」にする
  • 「Resizable Window」にチェックを入れる

アスペクト比維持問題

この問題を解決する為には下記の対応を行います ウィンドウサイズを監視して一定間隔で Screen.SetResolutionでウィンドウサイズを強制的に指定した比率にリサイズする この時にGameObjectのUpdate関数などでリサイズしようとするとスプラッシュ表示中はユーザーが好きな比率でサイズ変更できてしまうという問題が発生します

この問題を解決する為に下記の実装を行います。
  • RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded) で監視を開始
  • Task.Runで非同期で監視を行う
  • 定期的に処理したいのでwhile(true)でループ
  • await Task.Delay(10);などで一定時間毎に処理を実行
サンプルプロジェクトでは下記コードで実装をしています
https://github.com/oTAMAKOo/Example-StandAloneWin/blob/315991c362ad52fd226c5d41c376ca28b37e2eae/Example-StandAloneWin/Assets/Scripts/Modules/StandAloneWindows/Handlers/AspectRatioHandler.cs#L250

最小、最大ウィンドウサイズを指定したい

この問題は前の項で定期チェックを行う際に最小、最大サイズにリサイズ時のサイズを制限する事で実現する事ができます。

サンプルプロジェクトでは下記コードで実装をしています
https://github.com/oTAMAKOo/Example-StandAloneWin/blob/315991c362ad52fd226c5d41c376ca28b37e2eae/Example-StandAloneWin/Assets/Scripts/Modules/StandAloneWindows/Handlers/AspectRatioHandler.cs#L199

縦長のウィンドウなどがあるので最大化ボタンは押せないようにしたい

この問題を解決する為に下記の実装を行います。
  • RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)でウィンドウスタイルを変更する
スプラッシュの前にウィンドウスタイルを変更する必要があるのでBeforeSplashScreen のタイミングでWin32 APIを呼び出してウィンドウスタイルを変更します。

サンプルプロジェクトでは下記コードで実装をしています
https://github.com/oTAMAKOo/Example-StandAloneWin/blob/master/Example-StandAloneWin/Assets/Scripts/Modules/StandAloneWindows/Handlers/WindowStyleHandler.cs

まとめ

Windows版アプリ作成時に画面比率系の問題を解決したことについてまとめました 。
結果として画面サイズを変更できるようにしつつ比率を綺麗に維持できるようになりました。
最後まで読んでくださりありがとうございます。