ゲームのウィンドウを少し小さくしたい。動作が重いので画質を下げたい。BGMはもう少し控えめにしたい。設定画面は、プレイヤーが自分の遊びやすい状態を選ぶための場所です。
ただし、選択欄やスライダーを置いただけでは、ゲームの設定は変わりません。UIで選んだ値を反映し、次に起動したときにも戻せるようにするところまでが、設定画面の仕事です。
この記事では、画面まわりを受け持つGame User Settingsと、BGM音量を保存するSaveGameを使い、3項目の小さな設定画面を作ります。

この記事でわかること
- 画面設定と音量で、保存先を分ける理由
- SetとApplyで何が変わるのか
- Game User Settingsの適用と保存の手順
- 起動し直しても設定が残ることの確かめ方
この記事で作るもの
- ウィンドウのサイズと画質を選び、「適用・保存」で反映する
- BGM音量はスライダーで聞き比べ、同じボタンで保存する
- ゲームを起動し直して、画面設定と音量が戻ることを確かめる
UE5のBlueprintで変数・関数を作ったことがあり、UMG入門のWidget配置とボタンイベントが分かる方を想定しています。実践はWindowsのStandalone Gameで、起動時から設定画面を表示する練習用です。
画面設定と音量は、保存先を分ける
Game User Settingsは、解像度・表示モード・画質などを持つ、UE標準の設定用オブジェクトです。Blueprintでは Get Game User Settings で取得します。新しく作る必要はなく、返ったオブジェクトを各設定ノードのTargetへ渡します。
画面設定を保存すると、通常は GameUserSettings.ini という設定ファイルへ書き込まれます。ゲーム側は起動時にその設定を読み込みます。解像度用のSaveGameクラスや、自前のファイル読み書きを一から用意せずに済みます。
一方、標準のGame User Settingsには、今回使う「BGM音量」の項目はありません。こちらは自分で変数を用意し、SaveGameへ保存します。SaveGameは、保存したい値を自分で決められる入れ物です。
| 今回残したいもの | 反映する相手 | 保存先 |
|---|---|---|
| ウィンドウのサイズ・画質 | Game User Settings | GameUserSettings.ini |
| BGM音量 | 再生中のAudio Component | 音量用のSaveGame |
同じ「適用・保存」ボタンから、2つの保存処理を呼びます。見た目は1つの設定画面でも、すべてを同じ場所に保存する必要はありません。
Audio Componentは、再生中の音を操作する部品です。今回のBGMも、音量を変えたいときはこの部品を指定します。

進行データにもSaveGameを使えますが、音量は冒険のセーブスロットとは別にすると扱いやすくなります。新しいゲームを始めても、プレイヤーが選んだ音量を引き継げるためです。
SetとApplyで、何が変わるのか
画面設定は、値を指定する段階と、その値をゲームへ反映する段階に分かれます。
| ノード | 行うこと |
|---|---|
Set Screen Resolution など | Game User Settingsが持つ設定値を変更する |
Apply Settings | 設定をゲームへ適用し、保存も行う |
Save Settings | 設定値を保存する。Apply Settingsの中でも自動で呼ばれる |
たとえば、Set Screen Resolutionへ1280×720を渡すだけでは、ウィンドウをそのサイズへ切り替える処理はまだ終わっていません。最後にApply Settingsを呼びます。
Apply Settingsは、適用だけでなく保存まで行います。 その直後にSave Settingsを追加する必要はありません。Apply Settingsの公式仕様、Save Settingsの公式仕様
今回は画面設定を選択欄に置いておき、「適用・保存」を押したときにSetとApplyをまとめて呼びます。選ぶ途中で何度も画面が切り替わるのを避けられます。

画面サイズと画質の選び方
解像度だけでなく、表示モードもそろえる
解像度は、描く画面の横と縦の画素数です。1280×720なら、横1280・縦720。Blueprintでは整数2つをまとめた Int Point を使い、Xへ横、Yへ縦を入れます。
同じ解像度でも、表示モードによって見え方が変わります。
| モード | 画面の使い方 |
|---|---|
| Windowed | 枠のあるウィンドウで表示する。今回のサイズ変更に使う |
| Windowed Fullscreen | デスクトップ全体を使う、枠のないウィンドウ |
| Fullscreen | 全画面表示。対応する解像度や切り替え方は実行環境にもよる |
今回見たいのは、ウィンドウを800×600と1280×720へ切り替えたときの違いです。そのため、サイズを変更するときに Set Fullscreen Mode で Windowed を指定します。Windowed Fullscreenのまま、画面の枠が小さくなることを期待しないようにします。

画質は、複数の項目をまとめて変えられる
Scalabilityは、影や描画距離などの品質を調整し、見た目と処理負荷の釣り合いを取る仕組みです。Set Overall Scalability Level を使うと、複数の項目をまとめて切り替えられます。

| 値 | 段階 | 今回の選択肢 |
|---|---|---|
| 0 | Low | 低 |
| 1 | Medium | 中 |
| 2 | High | 高 |
| 3 | Epic | 最高 |
| 4 | Cinematic | 今回は追加しない |
一方、Get Overall Scalability Level は、個別に調整された設定では -1 を返すことがあります。これはエラーではなく、「全項目が同じ段階にそろっていない」という意味です。
そこで今回は、選択欄の先頭に「変更しない」を置きます。画質を選ばなければ、現在の個別設定やCinematicもそのままです。音量だけを保存したつもりで、画質まで一括変更することを防げます。
実践1:設定画面を表示する
練習用の画面を作る
Third Personテンプレートのレベルを別名 L_SettingsPractice で保存します。ウィンドウの大小を試せるよう、デスクトップは1600×900以上を目安に、候補のウィンドウが収まる環境で進めま す。収まらない場合は、後のサイズ候補も小さくしてください。
User Widgetを親に WBP_SettingsPractice を作ります。DesignerにCanvas Panelを置き、その下へ次の部品を並べます。
Canvas Panel
└─ Size Box
└─ Border
└─ Vertical Box
├─ Text「設定」
├─ Text「ウィンドウサイズ」
├─ Combo Box (String)「ResolutionCombo」
├─ Text「画質」
├─ Combo Box (String)「QualityCombo」
├─ Text「BGM音量(動かすと試聴)」
├─ Slider「VolumeSlider」
├─ Button「ApplyButton」
│ └─ Text「適用・保存」
├─ Text「CurrentSettingsText」
└─ Text「StatusText」
Size BoxのCanvasスロットはAnchorsを中央、Alignmentを 0.5 / 0.5、Positionを 0 / 0、Auto Sizeをオンにします。Size BoxはWidth Overrideをオンで 520、Height Overrideはオフ。Borderは白、Paddingは 24 にします。
文字は濃紺、見出しはFont Size 28、ほかのTextは 18。Vertical Box内の各部品は横Fill、上下Padding 4 とします。ApplyButton内のTextは中央揃え、Padding 10。最後の2つのTextはAuto Wrap Textをオンにして、長い文字を折り返します。初期の表示文字は空にします。
ApplyButtonのStyleはNormalのTintを青にし、ボタン内のTextだけ白にします。2つのCombo BoxはFont Sizeを18、Foreground Colorを濃紺にします。
名前を付けた2つのCombo Box、Slider、Button、最後の2つのTextは、Is Variableをオンにします。これでグラフへドラッグし、値を読んだり表示を書き換えたりできます。

図は処理まで組み終えたときの表示例です。今は最後の2つのTextが空でも構いません。
選択肢は、この順番で登録する
Combo Box (String)は、文字列の候補から1つ選ぶ部品です。DetailsのDefault Optionsへ、次の順で追加してください。両方ともSelected Optionは 変更しない にします。
| Index | ResolutionCombo | QualityCombo |
|---|---|---|
| 0 | 変更しない | 変更しない |
| 1 | 800 x 600 | 低 |
| 2 | 1280 x 720 | 中 |
| 3 | — | 高 |
| 4 | — | 最高 |
Indexは、0から始まる候補の番号です。後で「2番目を選んだら800×600」と判断するため、この並びを使います。左列の「—」は候補として追加しません。
VolumeSliderはMin Valueを 0、Max Valueを 1、Valueを 0.5 にします。初期状態ではIs Enabledをオフにしておき、BGMの準備ができた後にオンへ戻します。
レベル開始時に表示する
L_SettingsPracticeのLevel Blueprintで、Event BeginPlayから次の順につなぎます。Get Player Controller のPlayer Indexは 0 です。
| 順番 | ノード | 接続・設定 |
|---|---|---|
| 1 | Create Widget | Class=WBP_SettingsPractice、Owning Player=Get Player ControllerのReturn Value |
| 2 | Add to Viewport | Target=Create WidgetのReturn Value |
| 3 | Set Input Mode UI Only | Player Controller=Get Player Controller、In Widget to Focusは空、Mouse Lock=Do Not Lock |
| 4 | Set Show Mouse Cursor | Target=Get Player Controller、値=オン |
白い実行線は表の順です。Get Player Controllerの青い出力は、表で指定した3か所へ分けてつなぎます。

表示しただけでは操作できません。入力の向き先も変えます。

この練習はマウスで設定画面を操作するため、Input ModeをUI Onlyにします。表示だけでなく入力先もUIへ切り替え、カーソルを出す、という組み合わせです。
「Play」の実行方法を Standalone Game にして開始します。エディタのビューポートから独立してゲームを動かす実行方法です。選択欄が開き、ボタンをクリックできれば、画面の準備はできています。ここではまだ、候補を選んでも画面設定は変わりません。練習を終えるときは、ゲームウィンドウを閉じます。
実践2:画面設定を反映する
ここからはWBP_SettingsPracticeのGraphを使います。
変数 VideoSettings を Game User Settings Object Reference 型、初期値Noneで作ります。参照は、後から同じ設定オブジェクトを指定するためのものです。
Event On Initializedから Get Game User Settings → Set VideoSettings の順に白い実行線をつなぎます。Get Game User SettingsのReturn Valueは、Set VideoSettingsの値へ渡します。On Initializedは、このWidgetの実体が初期化されるときに1回呼ばれます。今回の画面はレベル開始時に1つだけ作ります。

図中の「次の図へ」につながる処理は、現在値の表示と音量の読み込みです。まずはここまで組み、各処理を作った後につなぎます。
適用処理を3段に分ける
引数なしの関数 ApplyPracticeVideo を作り、入口から Sequence をつなぎます。Add pinでThen 2まで増やします。
Sequenceは、Then 0につないだ処理を 進めた後、Then 1、Then 2へ順に進むノードです。今回は待ち時間を挟む処理を使わないので、「サイズ → 画質 → 最後に適用」の順になります。

Then 0:選んだときだけ、ウィンドウサイズを変える
ResolutionComboのGetから Get Selected Index を取得します。その整数を Switch on Int のSelectionへ渡し、Then 0の白い線をSwitchへつなぎます。出力は0・1・2を用意します。
Switch on Intは、受け取った番号と同じ番号の実行出力へ進むノードです。今回は、選択欄の番号に応じてサイズの設定先を分けます。
| Switchの出力 | つなぐ処理 |
|---|---|
| 0 / Default | 何もしない |
| 1 | Set Screen ResolutionへMake Int Point(X=800、Y=600)→ Set Fullscreen Mode(Windowed) |
| 2 | Set Screen ResolutionへMake Int Point(X=1280、Y=720)→ Set Fullscreen Mode(Windowed) |
1側と2側に、それぞれSet Screen ResolutionとSet Fullscreen Modeを置きます。どちらのTargetもVideoSettingsです。Get VideoSettingsから青い線を伸ばして作ると、対象を間違えにくくなります。
0側へ何もつながなくても、Sequenceは次のThen 1へ進みます。何も選ばれていない場合の -1 などもDefaultへ入り、サイズ変更をせ ずに先へ進みます。

図の右端は、各出力の行き先の説明です。「変更しない」というノードを作る必要はありません。

解像度と一緒に、ウィンドウの形式も指定します。

Then 1:画質を選んだ場合だけ、一括設定する
QualityComboからGet Selected Indexを取得し、In Range (Integer) へ渡します。Min= 1、Max= 4、Inclusive Min / Maxは両方オンです。「番号が1〜4に入っているか」を調べます。

Then 1からBranchへ進み、ConditionへIn RangeのBoolean出力を渡します。BooleanはTrue / Falseの2値で、ここでは「範囲に入っている/いない」を表します。
- True:
Set Overall Scalability Levelを呼ぶ。Target=VideoSettings、Value=選択Indexから1を引いた整数 - False:何もしない

「低」はIndex 1ですが、UEへ渡す画質値は0です。この1つ分のずれを、整数の引き算で合わせます。「変更しない」は範囲外なので、Setを呼びません。

Then 2:まとめて適用・保存する
Then 2から Apply Settings を呼びます。TargetはVideoSettings、Check for Command Line Overridesはオフです。この入力は、起動時のコマンド指定を優先するかどうか。練習では画面で選んだ値を使います。
これで、サイズや画質を選んだ場合も、どちらも「変更しない」の場合も、最後に1回Apply Settingsへ進みます。Save Settingsは追加しません。
ボタンにつない で、小さく確かめる
DesignerのApplyButtonからOn Clickedを追加し、Apply Practice Video(Target=Self)を呼びます。その後へPrint Stringをつなぎ、Video settings applied と表示します。
コンパイル・保存してStandaloneで開始します。800×600と1280×720を交互に選び、「適用・保存」を押してください。ウィンドウの大きさが変われば、UIから画面設定までつながっています。
画質は「低」と「高」を切り替えます。影などの変化はシーンの内容で異なるため、見た目だけで判断せず、次の表示も用意しましょう。
今の設定値を画面に出す
引数なしの関数 RefreshPracticeStatus を作ります。Get VideoSettingsから、Get Screen ResolutionとGet Overall Scalability Levelを取得します。
Get Screen Resolutionの戻り値を Break Int Point でX・Yに分けます。画質の整数は、次のように表示名へ置き換えます。
- Get Overall Scalability Levelの値へ、整数の足し算で
1を加えます。個別設定の-1が0、Lowの0が1になります。 - その値を
SelectノードのIndexへつなぎます。Add pinで選択肢を6つに増やし、出力の型をTextにします。 - Option 0から順に
個別設定 / 低 / 中 / 高 / 最高 / Cinematicと入力します。
Selectは、番号に対応する値を1つ返すノードです。実行の行き先を分けるSwitchとは違い、ここでは表示する文字を選びます。

Format Text のFormatへ 設定値:{W} x {H} / 画質 {Q} と入力し、WへX、HへY、QへSelectのReturn Valueを渡します。Format Textは、文章の波括弧の場所へ値を埋めるノードです。

関数入口からCurrentSettingsTextの Set Text を呼び、In TextへFormat TextのResultを渡します。

RefreshPracticeStatusは、次の2か所から呼びます。
- Event On InitializedのSet VideoSettingsの後
- ApplyPracticeVideoのThen 2にあるApply Settingsの後

起動時に候補が「変更しない」へ戻るのは、設定が消えたという意味ではありません。上の選択欄はこれから変える内容、下のTextは現在持っている設定値です。
実践3:BGM音量を変えて保存する
画面設定が動いたら、BGMを追加します。今回は、設定画面で流すBGM1本の音量を変えます。ゲーム全体のマスター音量ではありません。
1. 繰り返し鳴るBGMを用意する
用意したWAVファイルをコンテンツブラウザへドラッグして、Sound Waveとしてインポートします。そのアセットを右クリックしてCreate Cueを選び、できたSound Cueを SC_SettingsPracticeBGM と名付けます。Sound Cueは、どの音をどう再生するかを組むアセットです。
Sound Cueを開き、音声を指定したWave PlayerをOutputへつなぎます。Wave PlayerのDetailsで Loopingをオンにします。プレビューで繰り返し鳴ることを確かめて保存してください。
音量0からも戻せるよう、Sound Cueの設定でVirtualization Modeを Play When Silent にします。無音になっても再生を続ける設定です。あとでスライダーを0まで下げ、再び上げる操作も確かめます。
2. 音量を保存する入れ物を作る
SaveGameを親クラスにBlueprint SG_SettingsPracticeAudio を作ります。変数 BGMVolume をFloat型、初期値 0.5 で追加し、コンパイル・保存します。
Floatは、0.5のような小数を扱う型です。音量を0〜1の間で細かく変えるために使います。
WBP_SettingsPracticeにも、次の2変数を追加します。
| 変数 | 型 | 初期値 |
|---|---|---|
| AudioPreferences | SG_SettingsPracticeAudio Object Reference | None |
| PreviewAudio | Audio Component Object Reference | None |
AudioPreferencesは保存する値を持つ入れ物、PreviewAudioは実際に鳴っている音を操作するための参照です。同じ音量でも、保存する値と、今鳴らしているものを分けて扱います。
保存場所の名前は SettingsPracticeAudio、User Indexは 0 に統一します。ここでいうSlot Nameは、保存データを識別する名前です。保存時と読み込み時で1文字でも違うと、別のデータを探すことになります。
3. まず既定値を用意し、保存済みなら読み戻す
引数なしの関数 LoadPracticeAudio と StartPracticeAudio を作り、いったんコンパイルします。
LoadPracticeAudioは、次の順で組みます。
Create Save Game ObjectのSave Game ClassをSG_SettingsPracticeAudioにする。- Return ValueをSet AudioPreferencesの値へつなぐ。白い実行線もCreateからSetへつなぐ。
- その後で
Does Save Game Existを呼ぶ。Slot Name=SettingsPracticeAudio、User Index=0。 - 実行出力をBranchへ、Return ValueをConditionへつなぐ。

BranchのFalseでは、そのままStartPracticeAudio(Target=Self)を呼びます。初回は保存データがないので、先ほど作った既定値0.5を使います。

Trueでは Load Game from Slot を呼び、同じSlot NameとUser Indexを指定します。そのReturn Valueを Cast To SG_SettingsPracticeAudio のObjectへ、白い実行線をCastの実行入力へつなぎます。
Castは、読み戻したデータを今回のSG_SettingsPracticeAudioとして扱えるか確かめる処理です。成功すれば、その中のBGMVolumeを読めます。
Castが成功したら、As SG Settings Practice AudioをSet AudioPreferencesへ渡し、その後でStartPracticeAudioを呼びます。これで、既定値の入れ物が保存済みのものへ置き換わります。
Cast FailedではPrint Stringで Audio preferences could not be loaded と出し、その後でStartPracticeAudioを呼びます。読み戻せなかった場合も、最初に用意した0.5で画面を使えます。

4. 読んだ音量で再生を始める
StartPracticeAudioの中で、Get AudioPreferencesからGet BGMVolumeを取得し、Clamp (Float) へ渡します。Min=0、Max=1です。Clampは値を指定範囲へ収める処理で、ここではスライダーと同じ範囲にそろえます。

白い実行線を次の順につなぎます。
| 順番 | ノード | 接続・設定 |
|---|---|---|
| 1 | VolumeSliderの Set Value | In Value=ClampのReturn Value |
| 2 | Spawn Sound 2D | Sound=SC_SettingsPracticeBGM、Volume Multiplier=同じClampのReturn Value、Pitch=1、Start Time=0、Persist Across Level Transition=オフ、Auto Destroy=オン |
| 3 | Set PreviewAudio | 値=Spawn Sound 2DのReturn Value |
| 4 | VolumeSliderの Set Is Enabled | In Is Enabled=オン |
Spawn Sound 2Dは、音を鳴らし始めると同時に、その音を操作できるAudio Componentを返します。保存済みの音量を最初から渡すので、起動直後だけ大きな音で鳴ることを避けられます。Spawn Sound 2Dの公式仕様

鳴らし始めた音は、あとで音量を変えられるように残しておきます。

最後に、Event On InitializedのRefreshPracticeStatusの後へ、LoadPracticeAudioをつなぎます。起動時は「画面設定の取得・表示 → 音量の読み込み → BGM再生」という順です。

5. スライダーを動かして聞き比べる
VolumeSliderのOn Value Changedを追加します。イベントの白い実行出力を、実行ピン付きの Is Valid へつなぎます。Input ObjectはGet PreviewAudioです。
Is Valid側から Set Volume Multiplier を呼び、TargetへPreviewAudio、New Volume MultiplierへOn Value ChangedのValueを渡します。Is Not Valid側は何もしません。再生開始前の初期化で値が変わっても、まだ存在しないAudio Componentを操作しないためです。

Standaloneで開始し、スライダーを左右へ動かします。1は元の音量倍率、0.5はその半分の倍率です。聞こえる大きさが、ちょうど半分になるという意味ではありません。
まだ保存処理はないので、この段階では起動し直すと既定値へ戻ります。次で、選んだ音量も残します。
6. 同じボタンから音量も保存する
引数なしの関数 SavePracticeAudio を作ります。
Get AudioPreferencesの青い出力から Set BGMVolume を作り、値へVolumeSliderのGet Valueを渡します。SetのTargetはAudioPreferencesです。Widget自身へ同名の変数を作る必要はありません。

その後へ Save Game to Slot をつなぎます。Save Game ObjectはAudioPreferences、Slot NameはSettingsPracticeAudio、User Indexは0。実行出力をBranchへ、Return ValueをConditionへ渡します。

| Branch | 行うこと |
|---|---|
| True | StatusTextをSet Textで「画面設定を適用しました。BGM音量も保存しました。」へ変更 |
| False | StatusTextを「画面設定は適用済みです。BGM音量の保存に失敗しました。」へ変更 |
このReturn Valueで確認できるのは、音量用SaveGameの保存成否です。Apply Settings全体の保存成功を判定する値ではありません。

ApplyButtonのOn Clickedを、Apply Practice Video → Save Practice Audio の順にします。先ほどのPrint Stringは外します。画面設定はApply Settings、音量はSave Game to Slotで保存される形になりました。

起動し直して確かめる
コンパイル・保存してStandalone Gameを起動します。今回の保存データは、練習中も次回へ残ることを前提に確かめます。
| 操作 | 確かめる結果 |
|---|---|
| サイズを1280×720、画質を「高」にして適用 | ウィンドウの大きさが変わり、現在の設定表示も1280×720・高になる |
| 音量を少し下げ、適用・保存を押す | BGMが小さくなり、音量保存の結果が表示される |
| 音量を0まで下げ、再び上げる | 無音から音が戻る。戻らなければSound CueのPlay When Silentを確認する |
| ゲームウィンドウを閉じ、同じ練習を再実行 | 起動時の設定値が残り、BGMも保存した音量で鳴り始める |
| サイズ・画質を「変更しない」にして、音量だけ変えて保存 | 画面設定を一括変更せず、音量を更新できる |
| 音量を変えて試聴し、保存せず閉じる | 次回は最後に保存した音量へ戻る |
設定欄の見た目だけでなく、反映された結果と次回起動の両方を見るのがポイントです。Standaloneで確かめた後は、配布用にパッケージしたゲームでも同じ往復を確認してください。エディタの起動設定やコマンド指定が、画面サイズに影響する場合もあります。

うまくいかないとき
| 症状 | 確認する場所 |
|---|---|
| 設定画面 は見えるが押せない | UI Only、Show Mouse Cursor、部品のIs Enabled |
| サイズが変わらない | Standaloneで実行しているか、Windowedを設定したか、Then 2がApply Settingsへつながっているか |
| 画質の段階が1つずれる | ComboのIndexから1を引いているか |
| 音量だけの変更で画質まで変わる | Index 1〜4のときだけSet Overall Scalability Levelを呼んでいるか |
| BGMが鳴らない | Sound Cue単体のプレビュー、Spawn Sound 2DのSound、保存済み音量、Load後にStartPracticeAudioへ進むか |
| スライダーを動かしても音が変わらない | Set Volume MultiplierのTargetがPreviewAudioか、Valueがつながっているか |
| 音量が次回に戻らない | Set BGMVolumeのTarget、Save Game Object、保存・読込のSlot NameとUser Index |
| 候補は「変更しない」だが設定が消えたように見える | 現在値はCurrentSettingsTextで確認する。候補は次に変更する項目を選ぶもの |
おまけ:自分のゲームへ組み込むなら
解像度の候補を増やす。 今回の固定2候補は、ウィンドウの大小を確かめる練習用です。製品では、対象環境や表示モードに合う候補を用意します。全画面用にはGet Supported Fullscreen Resolutions、ウィンドウ用にはGet Convenient Windowed Resolutionsが出発点です。候補の配列が空、現在値が候補にない、未選択のIndexが-1、といった場合も扱います。
変更前へ戻す確認画面。 Fullscreenなども選べるようにする場合は 、「この設定を使いますか?」と確認し、時間切れで前の表示へ戻すと操作を取り戻しやすくなります。Apply Settingsは保存も行うので、取り消すときも前の値を適用・保存する流れまで設計します。
BGM以外の音量。 今回操作するのはPreviewAudioの1本です。複数のBGMや効果音をまとめて調整するなら、Sound Classで音をグループに分け、Sound MixやAudio Modulationなどで制御します。保存する値と実際の音へ反映する処理を分ける、という考え方は同じです。
プレイ中の設定メニューへ広げる。 今回はレベル開始時にWidgetを1回だけ作ります。開閉するメニューへ変えるなら、BGMの再生担当は画面の外へ移し、開くたびに同じ曲が重ならないようにします。閉じるときの入力・カーソルの戻し方は、ポーズメニューの記事が続きになります。
保存処理の規模。 今回のSaveGameは音量1項目なので、処理が終わるまで待つ通常の保存・読み込みを使いました。大きな進行データを同時に扱うなら、非同期保存などを検討します。詳しくはEpicのゲームの保存と読み込みを参照してください。
まとめ
画面設定はGame User Settingsへ値を渡し、Apply Settingsで適用・保存します。BGM音量は再生中のAudio Componentへ反映し、SaveGameへ残した値を次の起動時に読み戻しました。
まずはウィンドウの大小とBGM音量を変え、いったんゲームを閉じてみてください。次に開いたときも自分で選んだ状態になってい れば、「選べるだけのUI」から、遊びやすさを調整できる設定画面へ進めています。
参考:一括画質の設定値、個別設定時の画質値、Sound Cueとループ、Save Game to Slot
設定画面を多言語へ広げるなら Localization Dashboardで日英を切り替える へ進んでください。