タイトル画面に「設定」ボタンを置くところまでは作れた。ただ、解像度をどこに保存すればいいのか分かりません。SaveGameのクラスを作って解像度と画質を書き出し、起動時に読み戻して適用する。そこまで設計してから作り始める人も多いはずです。
UEには、そのための専用クラスが最初から用意されています。 Game User Settings です。解像度・ウィンドウモ ード・画質・VSync・フレームレート上限を保持し、ファイルへの保存と起動時の読み込みまで自分で行います。この記事では、Game User Settingsで扱える項目と、Apply Settings と Save Settings という2つの呼び忘れやすいノード、そして音量だけが別経路になる理由を解説します。
この記事でわかること
- 画面まわりの設定は Game User Settings が最初から持っている
- 解像度と 3つのウィンドウモード の切り替え方
- 画質は Scalability の段階で指定する
Apply Settingsを呼ばないと反映されず、Save Settingsを呼ばないと次回に残らない- 音量だけはGame User Settingsの外側 にある
- 実践: 解像度・画質・音量を変えられる設定画面
設定の置き場所はもう用意されている
セーブデータを自分で設計するとき、解像度や画質をそこへ入れたくなります。ただ、この2つには扱いにくい性質があります。
- セーブスロットに紐づかない: 「スロット1は1920×1080、スロット2は1280×720」という作りには意味がありません。設定はプレイヤー個人のもので、進行データとは寿命が違います
- 起動直後に必要になる: タイトル画面を出す時点でもう反映されていてほしい値です。セーブデータの読み込みを待てません
UEはここを分けています。進行データは SaveGame 、画面まわりの設定は Game User Settings です。

Blueprintから触るには Get Game User Settings ノードを呼びます。引数はなく、戻り値の Game User Settings オブジェクトに対して各ノードを繋いでいきます。どのBlueprintからでも呼べて、ゲーム全体で同じ1つを指します。
扱える項目は、おおむね次のとおりです。
| 設定 | 書き込むノード | 読み出すノード |
|---|---|---|
| 解像度 | Set Screen Resolution | Get Screen Resolution |
| ウィンドウモード | Set Fullscreen Mode | Get Fullscreen Mode |
| 画質(一括) | Set Overall Scalability Level | Get Overall Scalability Level |
| 画質(個別) | Set Shadow Quality など項目ごと | Get Shadow Quality など |
| 垂直同期 | Set VSync Enabled | Is VSync Enabled |
| フレームレート上限 | Set Frame Rate Limit | Get Frame Rate Limit |
ここに 音量が無い ことに気付いてください。この点は後の節で扱います。
保存先はプロジェクトの外、ユーザーごとの領域にある GameUserSettings.ini です。Windowsのパッケージ版なら %LOCALAPPDATA%\<プロジェクト名>\Saved\Config\Windows\GameUserSettings.ini 、エディタでの動作確認中はプロジェクトの Saved/Config/WindowsEditor/GameUserSettings.ini を見ています。 確認用とパッケージ版でファ イルが別なので、エディタで設定した内容はパッケージ版には引き継がれません。
解像度とウィンドウモード
解像度は Set Screen Resolution で指定します。ピンは Resolution の1つで、型は Int Point (XとYを持つ整数の組)です。
ウィンドウの出しかたは Set Fullscreen Mode で、In Fullscreen Mode に3つのうち1つを渡します。

| モード | 見え方 | 特徴 |
|---|---|---|
| Fullscreen | 画面全体を占有する | 指定した解像度がディスプレイ側に適用される。切り替えに一瞬かかる |
| Windowed Fullscreen | 画面全体に見えるが枠なしウィンドウ | 他アプリへの切り替えが速い。 多くのPCゲームの既定 |
| Windowed | 通常のウィンドウ | 解像度がそのまま ウィンドウの大きさになる |
迷ったら Windowed Fullscreen を既定にしておくと、切り替え時のちらつきや解像度の取り違えで困る場面が減ります。
選択肢そのものは、環境に合わせて作ります。 Get Supported Fullscreen Resolutions ノードが、そのディスプレイで使える解像度を Int Point の配列 で返します(戻り値のBooleanは取得に成功したかどうかです)。
| ノード | 返すもの | 向いている用途 |
|---|---|---|
| Get Supported Fullscreen Resolutions | フルスクリーンで使える解像度の配列 | フルスクリーン前提の選択肢 |
| Get Convenient Windowed Resolutions | いま繋がっている画面に収まるウィンドウ解像度の配列 | ウィンドウモード向けの選択肢 |
固定のリストを自分で書き並べると、ウルトラワイドや4Kの環境で選べない、あるいは画面より大きい解像度が並ぶ、という形で必ず破綻します。 選択肢は取得したものから作ってください。
注意: これらのノードは 接続されているディスプレイの都合を返します 。環境によっては空に近い配列が返ることもあるため、要素数が0だったときに既定の1つを入れておくと安全です。
画質はScalabilityの段階で指定する
UEの画質設定は Scalability という仕組みでまとまっています。影・テクスチャ・ポストプロセス・視距離といった項目が個別にあり、それらをまとめて段階で切り替えられます。
一括で変えるのが Set Overall Scalability Level です。Value に整数を渡します。

| Value | 段階 |
|---|---|
| 0 | Low(低) |
| 1 | Medium(中) |
| 2 | High(高) |
| 3 | Epic(最高品質) |
| 4 | Cinematic(映像制作向け) |
ゲームの設定画面では、 0〜3の4段階を出しておけば十分 です。Cinematic は映像制作用の段階で、実時間で遊ぶには重すぎます。
個別の項目は、それぞれ専用のノードで変えられます。
| ノード | 対象 |
|---|---|
| Set Shadow Quality | 影 |
| Set Texture Quality | テクスチャ |
| Set View Distance Quality | 表示距離 |
| Set Post Processing Quality | ポストプロセス |
| Set Anti Aliasing Quality | アンチエイ リアス |
| Set Visual Effect Quality | エフェクト |
ここに1つ、UIを作るときに引っかかる仕様があります。 Get Overall Scalability Level は、個別の項目がバラバラに設定されていると -1 を返します。 「影だけ低くして他は高い」という状態には、対応する段階が存在しないためです。
そのため、設定画面のドロップダウンに現在値を反映するときは、 -1 が返ってきた場合の扱いを決めておく必要があります。「カスタム」という選択肢を1つ足すか、単純にどこも選択されていない状態にしておくのが素直です。
補足: どの段階を初期値にするかを自動で決めたい場合は、
Run Hardware Benchmarkで計測し、Apply Hardware Benchmark Resultsを呼ぶ方法があります。初回起動時に1回だけ走らせて、以後はプレイヤーの選択を尊重する形にしてください。毎回走らせると、起動のたびに設定が上書きされます。
ApplyとSaveは別の仕事
ここが、この記事でいちばん覚えて帰ってほしい部分です。設定画面が動かない原因は、ほぼこの2つのどちらかに集約されます。
Set Screen Resolution も Set Overall Scalability Level も、 Game User Settingsの中の値を書き 換えるだけ です。画面には何も起こりません。

| ノード | やること | 呼ばないとどうなるか |
|---|---|---|
Set 〜 各種 | 値を書き込む | そもそも何も変わらない |
| Apply Settings | 書き込んだ値を 今の画面へ反映する | 選んでも画面が変わらない |
| Save Settings | 値を ファイルへ書き出す | 再起動すると元に戻る |
Apply Settings には b Check for Command Line Overrides というBooleanのピンがあります。コマンドライン引数(-ResX= など)が指定されていた場合に、そちらを優先するかどうかです。設定画面から呼ぶときは、プレイヤーの選択をそのまま通したいので false を渡します。
適用のノードは3つに分かれています。
| ノード | 反映する範囲 |
|---|---|
| Apply Settings | すべて |
| Apply Resolution Settings | 解像度・ウィンドウモード・VSync |
| Apply Non Resolution Settings | 画質などそれ以外 |
画質だけを変えたときに Apply Non Resolution Settings を使うと、ウィンドウの再構成が起きないぶん切り替えが滑らかです。ただ最初のうちは、 「適用」ボタンで Apply Settings → Save Settings の2つを順に呼ぶ 形に統一しておくほうが、抜けが出ません。
(適用ボタン On Clicked)
→ Get Game User Settings
→ Apply Settings(b Check for Command Line Overrides: false)
→ Save Settings
読み込みは自動です。ゲーム起動時にエンジンが GameUserSettings.ini を読んで反映するので、 Load Settings を自分で呼ぶ必要は通常ありません。設定画面側でやることは、 現在値をUIへ表示する ことだけです。
音量だけは別の経路にある
設定画面に3つ並べるなら、解像度・画質・音量です。ところが 音量はGame User Settingsに含まれていません 。
音量はレンダリングの設定ではなく、オーディオのミキシングの一部だからです。UEでは Sound Class で音をグループに分け、 Sound Mix でそのグループの音量を変えます。
| 決めたいこと | 使うもの |
|---|---|
| 画面まわりの設定 | Game User Settings |
| どのグループの音か | Sound Class |
| そのグループを今どれだけ鳴らすか | Sound Mix + Set Sound Mix Class Override |
つまり設定画面の音量スライダーは、次の2つを別々に面倒を見ることになります。
- 反映:
Set Sound Mix Class Overrideを呼ぶ - 保存: SaveGameなど、自分で用意した保存先へ書く
Sound ClassとSound Mixの組み立て方そのものは 3Dサウンドとミキシングの記事 にまとめてあります。仕組みはそちら、UIから繋ぐ部分はこの記事、という分担です。保存の受け皿には セーブ/ロードの記事 のSaveGameクラスがそのまま使えます。
実践:解像度・画質・音量の設定画面を作る
アクションゲームのタイトル画面、探索ゲームのポーズメニュー、シミュレーションの初回起動時。 設定画面はジャンルを問わず、公開するなら必ず求められます。 ここでは3項目だけの最小構成を、再起動しても値が残るところまで組みます。
完成形
ドロップダウンで 1280 x 720 を選んで「適用」を押すと、ウィンドウがその大きさに変わります。画質を「低」にすると影が粗くなります。一度アプリを終了して起動し直しても、選んだ解像度と画質のままで立ち上がります。

再現条件
Third Person テンプレート で新規プロジェクトを作り、次を用意します。音量部分は 3Dサウンドの記事 と同じ構成です。
| 種類 | 名前 | 設定 |
|---|---|---|
| Widget Blueprint | WBP_Settings | 下のレイアウトで作る |
| Sound Class | SC_Master | 作るだけ |
| Sound Mix | SM_UserAudio | Sound Class Effects に1件(SC_Master / Volume Adjuster 1.0 / Apply to Children true) |
| Sound Wave | 任意のBGM | Looping オン、 Sound Class に SC_Master |
WBP_Settings には、Canvas Panelの中央にVertical Boxを置き、次の4つを入れます。 4つとも Is Variable にチェック を入れてください。
| ウィジェット | 名前 | 初期設定 |
|---|---|---|
| Combo Box (String) | Combo_Resolution | 選択肢は空のまま(実行時に流し込む) |
| Combo Box (String) | Combo_Quality | Default Options に 低 / 中 / 高 / 最高 の4つを順に登録 |
| Slider | Slider_Volume | Min Value 0.0 / Max Value 1.0 / Value 1.0 |
| Button | Button_Apply | 中にTextを入れて「適用」 |
変数(WBP_Settings に作る)
| 変数名 | 型 | 初期値 | 用途 |
|---|---|---|---|
ResolutionList | Int Point の配列 | 空 | ドロップダウンと同じ並び順で解像度を保持する |
ドロップダウンには文字列しか入れられないため、対応する Int Point を 同じ順番の配列 で持っておき、選択された番号で引くのがいちばん確実です。文字列を 1280 x 720 から数値へ戻す処理は不要になります。
注意: エディタ内プレイ(PIE)では、解像度とウィンドウモードの変更が画面に現れません。 エディタのビューポートの中で動いているためです。確認は必ず
Playの横のドロップダウンからStandalone Gameを選んで行ってください。画質と音量はPIEでも変わります。
ステップ1:起動時に選択肢と現在値を用意する
WBP_Settings の Event Construct に 組みます。ここでやることは2つです。 選択肢を作ること と、 今の設定をUIへ反映すること です。

Event Construct
→ Get Supported Fullscreen Resolutions ── Resolutions(Int Point の配列)─┐
→ Set ResolutionList ←──────────────────────────────────────────────────┘
→ For Each Loop(Array = ResolutionList)
Loop Body:
→ Int Point の X / Y を取り出す(ピンを右クリック → Split Struct Pin)
→ Append("1280" + " x " + "720" の形に組む)
→ Add Option(Target = Combo_Resolution, Option = 組んだ文字列)
Completed ↓
→ Get Game User Settings
→ Get Overall Scalability Level ── Return Value ─┐
→ Branch(Return Value >= 0) │
True → Set Selected Index(Target = Combo_Quality, Index = ←┘)
False →(何もしない。個別設定でカスタム状態なので選択なしのまま)
→ Push Sound Mix Modifier(In Sound Mix Modifier: SM_UserAudio)
最後の Push Sound Mix Modifier を忘れないでください。 Sound Mixがアクティブでないと、音量のオーバーライドは何も起こしません。
Combo_Quality の選択肢を 低 / 中 / 高 / 最高 の順に並べたのは、 Get Overall Scalability Level が返す 0 〜 3 をそのまま Set Selected Index に渡せるようにするためです。
ステップ2:音量はその場で反映する
音量スライダーだけは、「適用」を待たずに動かした瞬間に反映させます。耳で確かめながら調整する項目だからです。
デザイナー上で Slider_Volume を選び、詳細パネル下部のイベント一覧から On Value Changed の + を押します。
Event On Value Changed(Slider_Volume)── Value ─┐
→ Set Sound Mix Class Override │
In Sound Mix Modifier : SM_UserAudio │
In Sound Class : SC_Master │
Volume : ←──────────────────┘
Pitch : 1.0
Fade In Time : 0.1
Apply to Children : true
Fade In Time の既定値は 1.0 秒です。スライダーに使うと反応が1秒遅れて感じるので、 0.1 まで下げます。
ステップ3:適用ボタンで書き込み・反映・保存を行う
Button_Apply の On Clicked に、この記事の要点をそのまま並べます。

Event On Clicked(Button_Apply)
→ Get Game User Settings ── Return Value を以降の Target に使う
→ Get Selected Index(Target = Combo_Resolution)── Return Value ─┐
→ Get(Target = ResolutionList, Index = ←──────────────────────┘)
→ Set Screen Resolution
Resolution : ← Get の結果(Int Point)
→ Set Fullscreen Mode
In Fullscreen Mode : Windowed Fullscreen
→ Get Selected Index(Target = Combo_Quality)── Return Value ─┐
→ Set Overall Scalability Level
Value : ←────────────────────────────────────────────────┘
→ Apply Settings
b Check for Command Line Overrides : false
→ Save Settings
Apply Settings と Save Settings が、この記事のすべてです。 上4つの Set 〜 は値を書き込むだけで、画面には何も起こりません。 Apply Settings が反映し、 Save Settings がファイルへ書き出します。
なお、この構成では音量が保存されません。3項目とも残したいなら、 Save Settings の後ろに SaveGame への書き出しを1本足し、 Event Construct で読み戻して Slider_Volume に Set Value してください。 画面設定はエンジンが、音量は自分が持つ という切り分けになります。
ステップ4:画面に出してマウスを使えるようにする
BP_ThirdPersonGameMode の Event BeginPlay に足します。
Event BeginPlay
→ Create Widget(Class = WBP_Settings)→ Add to Viewport
→ Get Player Controller → Set Show Mouse Cursor(true)
実際のゲームではポーズメニューから開くことになります。その繋ぎ方は ポーズメニューの記事 にあります。設定画面へ切り替えるときは、ポーズメニューを Remove from Parent せず Set Visibility で Collapsed にしておくと、戻るボタンが単純になります。
確認する
Play の横のドロップダウンから Standalone Game を選んで起動し、次の順に確かめてください。
- 解像度で
1280 x 720を選び、「適用」を押す。 ウィンドウが即座にその大きさへ縮みます - 画質を「低」にして「適用」を押す。 影のふちが粗くなり、遠くの草木の描画が簡略になります
- 音量スライダーを0へ動かす。 ボタンを押さなくても、その場でBGMが消えます
- ウィンドウを閉じ、もう一度
Standalone Gameで起動する。1280 x 720の低画質で立ち上がれば成功です Save Settingsのノードを外して、1と4をもう一度やる。 今度は元の解像度に戻ります
4と5を続けてやると、 Save Settings が何をしているかが1回で腑に落ちます。
うまくいかないときの切り分けです。
- 押しても画面が変わらない →
Apply Settingsを繋いでいない - エディタでは何も起きないが、値は変わっている → PIEの仕様。
Standalone Gameで確認する - 再起動すると元に戻る →
Save Settingsを呼んでいない - ドロップダウンが空のまま →
Get Supported Fullscreen Resolutionsの結果が0件。Get Convenient Windowed Resolutionsも試し、それでも空なら既定値を1件入れる - 選んだ解像度と違うサイズになる →
ResolutionListの並び順とドロップダウンの並び順がずれている。同じループの中で両方を作る - 画質のドロップダウンに何も選択されていない →
Get Overall Scalability Levelが-1を返している。個別の項目がバラバラの状態 - 音量スライダーを動かしても何も起きない →
Push Sound Mix Modifierを呼んでいない、またはBGMにSound Classを割り当てていない
ポイントは2つです。
- 書き込み・反映・保存は別のノード:
Set 〜は値を置くだけです。Apply Settingsで今の画面へ、Save Settingsでファイルへ。設定画面が動かないときは、この3段のどこで止まっているかを先に切り分けてください - 選択肢は環境から取得する: 解像度を固定のリストで書き並べると、ウルトラワイドや4Kの環境で必ず破綻します。
Get Supported Fullscreen Resolutionsの結果からドロップダウンを作り、対応するInt Pointを同じ並びの配列で持っておくのが最も壊れにくい形です
ゲームパッドでも操作できるようにする なら、次は フォーカス管理の記事 が続きになります。
うまく動かないときのチェック
設定画面まわりは、症状から原因を辿れる形になっています。
| 症状 | 見るところ |
|---|---|
| 何を選んでも画面が変わらない | Apply Settings を呼んでいるか |
| 反映はされるが再起動で戻る | Save Settings を呼んでいるか |
| エディタでだけ解像度が変わらない | PIEの仕様。Standalone Game で確認する |
| パッケージ版だけ既定の解像度で起動する | エディタ用とパッケージ用で GameUserSettings.ini が別。パッケージ版で1回設定し直す |
| 設定がおかしくなって直せない | GameUserSettings.ini を削除すると初期状態に戻る。または Set to Defaults → Apply Settings |
| 画質を上げても見た目が変わらない | 個別の項目が別途固定されていないか。 Get Overall Scalability Level が -1 なら混在状態 |
GameUserSettings.ini はテキストファイルなので、開けば実際に何が保 存されたかを目で確認できます。 「保存されていないのか、読み込めていないのか」を1回で切り分けられる ので、詰まったらまずこのファイルを見てください。
おまけ:先に知っておくと良いこと
- フレームレート上限の0は「無制限」:
Set Frame Rate Limitに0.0を渡すと上限なしになります。30601200のような選択肢を用意するのが定番です。なお実行中の一時的な確認だけなら、コンソールでt.MaxFPSを叩くほうが速く済みます - VSyncとフレームレート上限は別物:
Set VSync Enabledはディスプレイのリフレッシュレートに同期して画面の裂け(ティアリング)を防ぐ設定で、上限値の指定ではありません。両方を選択肢として並べておくと親切です Set to Defaultsは保存までしない: 「初期設定に戻す」ボタンを作るときは、Set to Defaultsの後にApply SettingsとSave Settingsを続けてください。ここでも3段の話は同じです- 操作キーの設定は別の仕組み: キーの割り当て変更はGame User Settingsではなく、Enhanced Input側で扱います。設定画面にタブを分けるなら、画面・音・操作の3つに分かれることになります
- 重い原因が画質とは限らない: 「低」にしても改善しないときは、描画ではなくBlueprintの処理やTickが原因のことがあります。先に計測してください(→ 統計コマンドの記事、LODとカリングの記 事)
- パッケージ後の初回起動を確認する: 設定画面の不具合は、パッケージ版でしか出ないものが少なくありません。解像度が絡む機能は、 必ず一度パッケージして確かめて ください(→ パッケージ化の記事)
まとめ
- 画面まわりの設定は Game User Settings に置き場所がある。SaveGameへ自分で詰め込む必要はない
- 触るのは
Get Game User Settingsから伸びるSet 〜のノード群。解像度は Int Point 、画質は 0〜3の段階 Apply Settingsで反映、Save Settingsで保存。 この2つの呼び忘れが不具合の大半- 選択肢は
Get Supported Fullscreen Resolutionsから作る。固定リストは環境で破綻する - 音量はGame User Settingsの外 。Sound Class + Sound Mixで変え、保存は自分で持つ
いま作っているゲームで、プレイヤーが最初に触りたくなる設定はどれでしょうか。その1項目だけでも動く設定画面があると、完成度の印象が大きく変わります。