Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 GameUserSettingsを使ってウィンドウモードなどを設定する

UE4.10か4.11辺りから"Game User Settings"というものを利用できるようになりました。
これは元々UE4のコンソールコマンド経由で設定できたものを、ブループリントのノードから設定できるようにしたものです。

以下のページに設定ができるブループリント用ノード一覧があります。

docs.unrealengine.com

コンソールコマンドの場合、コマンド名がわからなかったり、複雑なコマンド用文字列を生成しなくてはならなかったりで面倒が多いものです。

今回はこれらのノードの使い方と注意点についてを解説します。

基本的な使い方

まず、Game User Settingsにアクセスするためには、"Get Game User Settings"ノードを利用します。これはGet用のノードになっていますが、参照情報を取得し、内部情報を書き換えるために、純粋関数になっていないことに注意してください。

docs.unrealengine.com

あとはその参照情報をピンとして取得して、ノードを検索してSet系ノードを呼び出します。Set系ノードで情報をセットした後に、"Apply Settings"ノードで設定を適用します。

f:id:alwei:20160822153414p:plain

"Check for Command Line Overrides"にチェックをつけていると、コマンドライン上から設定した内容を上書きするようですが、基本的にコマンドラインからパラメーターを渡していなければ、つけていても問題ないはずです。

"Apply Settings"ノードは3種類あり、"Apply Setting"はSet系ノードで設定した情報を全て適用します。"Apply Resolution Settings"は解像度関連のみ、"Apply Non Resolution Settings"では解像度以外の設定を適用します。

Unreal Engine | Apply Settings
Unreal Engine | Apply Resolution Settings
Unreal Engine | Apply Non Resolution Settings

基本的な使い方はこれだけです。次は細かい注意点について解説します。

設定は自動保存

これらの設定は適用した段階でUE4側で自動的にコンフィグファイルに保存されます。"Save Settings"というノードがありますが、こちらを使用しなくてもなぜか保存されています。
なので次回以降の起動でもこの設定を適用した状態で起動することになります。
コンフィグファイル自体はWindowsの場合、デフォルトでは以下の場所に格納されます。

C:\Users\"ユーザー名"\AppData\Local\"プロジェクト名"\Saved\Config\WindowsNoEditor\GameUserSettings.ini

AppDataフォルダー以下は隠しファイルになっていますので、探す場合には隠しファイルを表示させてください。

なぜか自動保存されていることに気づかず、設定を変えてしまうと特に再設定しなければそのまま固定されてしまうので注意してください。

一度保存すると以下のようになります。

f:id:alwei:20160822154851p:plain

"sg.~~"となっている部分は描画クオリティの設定です。最高値であるEpic設定である場合には"3"、最低値の場合には"0"になります。

"sg.ResolutionQaulity"に関しては特殊な設定になります。これついては後述します。
Windowサイズの設定は"ResolutionSize"、フルスクリーン設定は"FullscreenMode"に格納されています。

"LastConfirmed"と書かれている設定はその設定を適用する前の設定が格納されているようです。元に戻したい場合などに利用します。
それでは次はWindowモードについてです。

Windowモードについて

UE4.12.5の段階では何も設定しないShippingでパッケージを作成した場合、Windowフルスクリーンモードと呼ばれるもので起動するようです。

Windowフルスクリーンモードは、ネイティブで用意されているフルスクリーンとは別物で、タスクバーなどの表示はされませんが、原理的にはWindowモードを画面一杯に広げたものだと思ってください。

ネイティブフルスクリーンモードを利用する場合には、ゲームをアクティブ化してから"Alt+Enter"キーで切り替えができるようになっています。これは特に設定をしていなければ、UE4製のゲームでは共通で利用できるショートカットキーなので覚えておきましょう。

ショートカット以外から利用するには、Game User Settingsノードから、"Set Fullscreen Mode"ノードを呼び出します。"In Fullscreen Mode"ピンからEnum値で設定できるので、必要なものを設定して、"Apply Settings"を呼んであげれば設定されます。

docs.unrealengine.com

またiniファイルに設定される"FullscreenMode"の数字は、"0"が"ネイティブフルスクリーンモード"、"1"が"Windowフルスクリーンモード"、"2"が"Windowモード"になっています。
ネイティブフルスクリーンとWindowフルスクリーンの最大の違いは、UMGなどのUIが適切に設定されるかされないかという部分があります。

ネイティブフルスクリーンではWindowサイズごと切り替えてしまうので、UMGのテクスチャーも解像度を変更するとそれに影響します。
またUIのレイアウトもディスプレイに合わせて横に長くなれば、横に引き伸ばされますし、縦に長い解像度の場合は縦に引き伸ばされます。
結果的に画面に全てのUIがレイアウトされますが、引き伸ばされてしまうこともあるので注意が必要です。

逆にWindowフルスクリーンでは、3D上の描画解像度のみの変更となります。UMGのテクスチャーは"Set Screen Resolution"で解像度を落としたとしても、元の描画解像度を維持しますので、綺麗に描画されつつ、ネイティブフルスクリーンのように引き伸ばしも行われません。
厳密に言えばこのWindowフルスクリーンは描画解像度以外の変更を行わず、後述の"sg.ResolutionQaulity"のみを弄っているようです。
なので、解像度を上げても描画解像度が上がらないと綺麗に描画されないということがあります。詳しくは後述の解像度スケールについてをご覧ください。

追記:弄ってませんでした。Windowフルスクリーンの状態で、"Set Screen Resolution"を呼んでも一切解像度は変更されませんので、注意してください。

f:id:alwei:20160822162608p:plain

結論としては複数解像度に合わせて作成する場合には、Windowフルスクリーンで作成すべきですが、ネイティブフルスクリーンは本来のGPUのフルパワーを使って動作するので、VRモードではこちらで動作するようになっています。
対応できる解像度に限界はありますが、できればネイティブフルスクリーンでの動作が理想的です。

追記:上述の追記で書いたように、Windowフルスクリーンで複数解像度に対応させる場合には、解像度スケールを変更するしかなさそうです。
ネイティブフルスクリーンの方が解像度変更の手間は少ないですが、総合的な見栄えではWindowフルスクリーンに劣るため、ケースバイケースで利用していくしかなさそうです。

解像度スケールについて

Windowサイズは基本的にWIndowサイズ=描画解像度となっていますが、Windowサイズはそのままで、描画解像度を落として更に描画負荷を落とすことが可能となっています。
それを行うのが"Set Screen Resolution"ノードと"SetResolutionScaleValue"ノードと"Set Screen Resolution Nomalized"ノードです。

Unreal Engine | Set Screen Resolution
Unreal Engine | SetResolutionScaleValue
Unreal Engine | Set Resolution Scale Normalized

ノードが3つほどありますが、数値の扱いがややこしいものとなっています。
"Set Screen Resolution"ノードはピクセル単位での描画解像度が設定可能です。細かい値の制御が可能です。
"SetResolutionScaleValue"はXとYを0から100のパーセンテージの割り合いで設定が可能です。
"Set Screen Resolution Nomalized"は同様にXとYを0から1の間で設定が可能です。

これが結構ハマりやすいところで、"SetResolutionScaleValue"を使って値を設定すると、設定値通りにいかないことがあります。
どうやらこの値はWindowサイズによって上限値と下限値が決められているらしく、単純に値を設定してそれ通りに設定されないことがあります。

この場合、"Set Screen Resolution Nomalized"を使用すると、正しく正規化された値を0から1の間で設定可能で、例えば「解像度を25%まで落としたい」という場合に"0.25"という値を設定すれば正常に適用できます。
下手に"SetResolutionScaleValue"を利用すると下限値の設定に引っかかりやすいので、"Set Screen Resolution Nomalized"を利用してください。

注意しなくてはならないのが、これらの設定はWindowサイズやWindowモードによって、自動的に書き変わることがあります。特にフルスクリーンモードを変更時には注意してください。フルスクリーンモード切り替え時にここが書き変わることがあります。

もし、ゲーム中の描画解像度がWindowサイズに対して粗くないか?と感じた場合には、iniファイルを開いて、"sg.ResolutionQaulity"の値を確認してください。
100以外の値が設定されている場合には、そのWindowサイズのネイティブ描画ではないので、画質が落ちていることになります。
この値も自動セーブとなっているので、気づかないうちに書き変わっていることがあり、混乱の元となっています。

それらに気をつけてユーザー側に設定させるメニューを作成してください!何か設定がおかしいな?と思ったら一度再起動させてみることも促してみてください。