前回のつづきで、UI Navigation 3.0のサンプルから画質や音量などのゲーム設定をプレイヤーが好みに調整できる機能を作っていきましょう。
本記事は音量の調整機能を作ります。
ゲームを終了させても保存・再読み込みする仕組みは近日別記事で。
設定メニューの前準備
画面解像度やスケーラビリティなどのやり方を説明しますが、その前に細かいケアを少々。
初期カーソル位置調整
オプション開いた直後にバックボタンにフォーカスが当たっています
好みの問題ですが、私は上にフォーカス当たっていてほしいので
ウィジェットの定義順を変えます
UIN_Execution Horizontal Box (Back/Applyボタンの親)がキャンバスパネルの子の一番上にいるのが原因で、
これを下にドラッグしてキャンバスパネルの子の中で一番下の順におけば、そのフォーカス順になります
メニュー画面からOption選択した直後に「Control」ボタンにフォーカスが当たっていれば成功です。
不要メニュー削除
自分がいらない設定は、テストするのも面倒で不具合のもとなので、いっそ消しちゃいましょう。
私はボタンを入れ替える機能は要らないので、消してしまいます。
使いたいけどマニュアル読んでもわからないって場合は
コメントください。
ボタンを消すだけだとイベントが残っているのでコンパイルエラーになります。
「グラフ」でこれも消しましょう
直後のセットノードも消して構いません。
音量設定メニュー
サウンドクラスの親子関係
Masterボリュームを変えると音楽も効果音も変わるようにします
今回は直接エンジンのファイルを書き換えちゃいますが
皆さんは複製なり新規作成して置き換えたほうがよいです
/All/EngineData/Engine/EngineSounds/Masterを開いて、その子にMusicとSFXをぶら下げます
Child Classesにドラッグアンドドロップで親子関係ができます
これでマスターボリュームを変えると両方変わって
SFXボリュームを変えるとSFXだけの音量が変わる けどマスターが0なら鳴らないみたいな
親子関係ができます
音源準備
これを試す用に効果音ラボさんから音を貰ってきました
- 携帯電話の着信音2
- 決定ボタンを押す37
ドラッグアンドドロップでコンテンツドロワーに置けば使えるようになります。
が、mp3形式なので、UE5.4じゃない人はWAV形式に事前に変換が必要です。
いちおうアセット名を英語にしておきます
着信音のほうの再生ボタンじゃないところをダブルクリックから編集画面を開いて、
Classに「Music」を設定し、BGMにします
BeginPlayの最後で音を鳴らします
OpenMenuなどのたびに鳴らす設定にしても、音の重複問題は実験上は大丈夫そうでしたが、
BeginPlayなどでで1回だけにしておくのがよいかと
ただし、直接サウンドのアセットだと、ループしないので1回だけしか鳴りません
なのでサウンドキュー(またはMetaSound)を作ってループ再生させます
これをさきほどのPlay Sound 2DのSoundでWaveの代わりに指定すれば鳴り続けます
ボタン音のほうはClassをSFXにします
すぐ変更反映
音量は調整して適用ボタン押して再度調整して、、、だと面倒ですね
スケーラビリティと同じように即変更する仕様に変更しましょう
変えたら音量がすぐわかるように効果音を鳴らします(BGMはさきほど鳴らしっぱなしにしているので勝手に鳴っています)
音の更新処理をApplyボタンのOnClickedイベントからお引越しして、その直後でボタン押す音を鳴らしてみましょう。
これで適用ボタンを押さなくても、Audioタブの3つのスライダーをどれか動かすと、音量が更新されます
が、それだけではうまくいきません(上図は最初のブランチで対処済みです)
原因は初期化時もUIの変更がなされて変化イベントが発動しているせいです
初期化のフラグを導入します。デフォルトTrueにしていて初期化終了でフラグをおろします
作ったりリセットするタイミングで変化イベントが起きちゃうのは
ついつい忘れちゃうバグりやすいところですね
ちなみにこのバグはもとから起きていて
スケーラビリティが設定メニュー開くたびにリセットされていました
それもついでに治りました
その他バグ修正
セットアップ(Reset Audio Settings関数)にはまだバグがあって
音量は現在のクラスボリュームをゲットしてセットしていますが
まずSFXのボリューム設定が間違えてMusicクラスを参照しています
あと、取得した後スライダーのレンジと掛け算した結果をTrancateで切り捨ての演算をしているのですが、浮動小数点の誤差は上下にズレるのに上側にズレる想定しかできてない状態です
この場合は四捨五入するRoundが適切です。Master・Music・SFXともすべてTruncate→Roundに置き換えましょう
上図は修正後の状態です。
浮動小数点の丸め誤差は結構ハマるので気を付けましょう。
0.7は正確には0.699999999みたいな0.7よりほんのちょっと小さい値だったりして、10倍して切り捨てると6になります。
保存する仕組みはまだなので、ゲーム起動中のみ変更が反映されてゲームを終了するとリセットされます。
が一旦完成とします
コメント