関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2016.08.25UE4UE/ C++
PC向けにゲームを作る時など、ウィンドウサイズを固定したい場合があるかと思います。
UE4では標準だと、ウィンドウの端をドラッグする事でウィンドウサイズを変えられてしまいます。
今回は UE4.12.5 にてウィンドウサイズを変更できないようにするやり方をご紹介します。
UE4でのウィンドウ生成は GenericApplication::MakeWindow で行われています。
GenericApplication はプラットフォーム単位で継承されており、固有処理に関してはそちらに書かれています。(例えば Windows なら WindowsApplication)
実際に上記のAPIを呼んでいるのは FSlateApplication::MakeWindow です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
SlateApplication::MakeWindowC++ TSharedRef& lt; FGenericWindow& gt; FSlateApplication::MakeWindow(TSharedRef InSlateWindow, const bool bShowImmediately) { TSharedPtr NativeParent = nullptr; TSharedPtr ParentWindow = InSlateWindow - > GetParentWindow(); if (ParentWindow.IsValid()) { NativeParent = ParentWindow - > GetNativeWindow(); } TSharedRef & lt; FGenericWindow& gt; FSlateApplication::MakeWindow(TSharedRef InSlateWindow, const bool bShowImmediately) { TSharedPtr NativeParent = nullptr; TSharedPtr ParentWindow = InSlateWindow - > GetParentWindow(); if (ParentWindow.IsValid()) { NativeParent = ParentWindow - > GetNativeWindow(); } TSharedRef< FGenericWindowDefinition > Definition = MakeShareable(new FGenericWindowDefinition()); ~~中略~~ Definition->HasCloseButton = InSlateWindow->HasCloseBox(); Definition->SupportsMinimize = InSlateWindow->HasMinimizeBox(); // ここで最大化可能かどうかを指定 Definition->SupportsMaximize = InSlateWindow->HasMaximizeBox(); Definition->IsModalWindow = InSlateWindow->IsModalWindow(); Definition->IsRegularWindow = InSlateWindow->IsRegularWindow(); Definition->HasSizingFrame = InSlateWindow->HasSizingFrame(); // ここでサイズが可変かどうかを指定 Definition->SizeWillChangeOften = InSlateWindow->SizeWillChangeOften(); Definition->ExpectedMaxWidth = InSlateWindow->GetExpectedMaxWidth(); Definition->ExpectedMaxHeight = InSlateWindow->GetExpectedMaxHeight(); ~~中略~~ TSharedRef< FGenericWindow > NewWindow = PlatformApplication->MakeWindow(); // ウィンドウ作成 InSlateWindow->SetNativeWindow(NewWindow); InSlateWindow->SetCachedScreenPosition(Position); InSlateWindow->SetCachedSize(Size); PlatformApplication->InitializeWindow(NewWindow, Definition, NativeParent, bShowImmediately); // ウィンドウ初期化 ~~中略~~ return NewWindow; } |
このように、ウィンドウ生成時に各種オプションを指定している状態です。
上記で説明した処理はUE4で生成される全てのウィンドウが対象です。
これにはゲーム実行時のウィンドウだけでなく、エディタそのものや各種ダイアログ等も含みます。
ゲーム実行時のウィンドウ生成は FSlateApplication::AddWindow を経由して UGameEngine::CreateGameWindow で行われています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
TSharedRef UGameEngine::CreateGameWindow() { int32 ResX = GSystemResolution.ResX; int32 ResY = GSystemResolution.ResY; EWindowMode::Type WindowMode = GSystemResolution.WindowMode; ~~中略~~ TSharedRef Window = SNew(SWindow) .ClientSize(FVector2D(ResX, ResY)) .Title(WindowTitle) .AutoCenter(AutoCenterType) .ScreenPosition(FVector2D(WinX, WinY)) .MaxWidth(MaxWindowWidth) .MaxHeight(MaxWindowHeight) .FocusWhenFirstShown(true) .SaneWindowPlacement(AutoCenterType == EAutoCenter::None) .UseOSWindowBorder(true); const bool bShowImmediately = false; FSlateApplication::Get().AddWindow(Window, bShowImmediately); ~~中略~~ return Window; } |
AddWindow 時に渡される SWindow に固定サイズにするためのオプションが指定されていません。
ini等で指定できるようにもなっていなさそうなので、以下の設定を追加しつつGitHubにあるソースコードからエンジンをビルドします。
※ソースコードからのエンジンビルドの話は割愛します
1 2 3 4 5 6 7 8 9 10 11 12 |
TSharedRef Window = SNew(SWindow) .ClientSize(FVector2D( ResX, ResY )) .SizingRule(ESizingRule::FixedSize) // 【!追加!】固定サイズに変更 .SupportsMaximize(false) // 【!追加!】最大化無効化 .Title(WindowTitle) .AutoCenter(AutoCenterType) .ScreenPosition(FVector2D(WinX, WinY)) .MaxWidth(MaxWindowWidth) .MaxHeight(MaxWindowHeight) .FocusWhenFirstShown(true) .SaneWindowPlacement(AutoCenterType == EAutoCenter::None) .UseOSWindowBorder(true); |
エンジンをビルド後、実行して Standalone Game で実行すると、ウィンドウサイズの変更や最大化ができないことが確認できます。
(わかりにくい画像ですが、右上の最大化ボタンが押せないようになっています…!)
このやり方で実現可能ですが、エンジンビルドを必要としないやり方があるといいですね。
(もし別の方法があったら教えて下さい…!)