PC向けにゲームを作る時など、ウィンドウサイズを固定したい場合があるかと思います。
UE4では標準だと、ウィンドウの端をドラッグする事でウィンドウサイズを変えられてしまいます。
今回は UE4.12.5 にてウィンドウサイズを変更できないようにするやり方をご紹介します。
ウィンドウの生成について
UE4でのウィンドウ生成は GenericApplication::MakeWindow で行われています。
GenericApplication はプラットフォーム単位で継承されており、固有処理に関してはそちらに書かれています。(例えば Windows なら WindowsApplication)
実際に上記のAPIを呼んでいるのは FSlateApplication::MakeWindow です。
|
TSharedRef< FGenericWindow > 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 で行われています。
|
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にあるソースコードからエンジンをビルドします。
※ソースコードからのエンジンビルドの話は割愛します
|
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 で実行すると、ウィンドウサイズの変更や最大化ができないことが確認できます。

(わかりにくい画像ですが、右上の最大化ボタンが押せないようになっています…!)
このやり方で実現可能ですが、エンジンビルドを必要としないやり方があるといいですね。
(もし別の方法があったら教えて下さい…!)