前回までのつづきで、UI Navigation 3.0のサンプルから画質や音量などのゲーム設定をプレイヤーが好みに調整できる機能を作っていきましょう。
本記事はグラフィックス関連の調整機能を作ります。
ゲームを終了させても保存・再読み込みする仕組みは、グラフィックスに関してはほぼ勝手にできていますが、足りない部分は近日別記事でやります。
画質設定のサンプルバグ修正
前回記事で「Reset Sound Settings」関数のバグを直しましたが
「Reset Video Settings」関数関連のバグも直しましょう
設定画面を開くたびにスケーラビリティがLowにリセットされる問題
これは再掲(前回の音の記事で対策済)です。
設定画面(ウィジェット)が画面に表示される前に構築されるタイミングで「Event On Horiz Comp Updated」が発動して、その時のスケーラビリティ項目の初期値である「Low」に変更されてしまうバグです。
まだやっていない方は、下記のように、対策しましょう。
一旦初期化中フラグ Initializing(名前は何でもOK)を初期値Trueで作成し、Event Pre Construct(表示前に動くイベント)の「Setup Option Boxes Index」で設定画面上の設定値が読み込まれた後でフラグをおろし、
「Event On Horiz Comp Updated」の最初にInitializingフラグが降りるまで何もしない分岐を追加しましょう。
細かくいうと、これでも適用ボタンおすと、設定メニュー上は開きなおすとLowになりますが、実際の設定はこれで正しく設定できてます
画面解像度設定がリセットされる問題
「Reset Video Settings」関数で、上から2番目の塊、画面解像度で「Get Desktop Resolution」デスクトップの解像度を見ていますが、これはユーザーが今使っている画面の解像度なのでゲームとは無関係に毎回目いっぱい広げた画面にしようという設定に初期化されています。
なので一旦自分で選んで画面サイズ変えたあと、再度Option画面開いてすぐApplyボタン押しても全画面になっちゃう(‘Д’)
正しくは「Get Screen Resolution」ゲームウィンドウの解像度です。下図は修正後。
丸め誤差問題
これも音の件と同じく、Truncate(切り捨て)じゃなくてRound(四捨五入)がよいです。
2個下の Resolution Scale にも同じミスがあります(画像は割愛します)
浮動小数点から整数に丸めるときの誤差問題は結構ハマるポイントです。
その他の箇所 Check If Video Options Changed
変更チェック「Verify Changed Options」/「Check If Options Changed」/「Check If Video Options Changed」の中にも同じように「Get Desktop Resolution」を見ちゃっているバグや「Round」使うべきところを「Truncate」にしているバグがあります。
私が見つけたバグは以上です。ほかにもバグ見つけた方は是非ご教示ください。
ただCheck If Options Changed 関数冒頭の「Check If Game Options Changed」関数:ゲームオプションのチェックは一切実装されていないのと、
スケーラビリティの設定変更時はGameUserSettingsの仕組みで即保存されているので、キャンセルしたところで中途半端になってしまいます。
であればいっそのことオプションを触って適用しないで閉じようとしたら適用を促すって形に
簡易化しようと思います
変更確認の簡易化
まず何か設定メニュー触ったら(=「Event On Horiz Comp Updated」が発生したら)ダーティーフラグを立てて
ApplyButton押下(適用)したらフラグ解除します
(前回記事みてない・やってない方はUpdate Audio Settingsの後でもOKです)
Check If Options Changed関数はこのフラグをただ返す処理とします。
これだけみてもとの「Check if 〇〇」の細かなチェックは捨てました
これで、設定メニューを何か触ると(一旦動かしたのをもどしたとしても)Apply押さないでBack押すと適用促されるって仕様になります。
ただしスケーラビリティを変えるとその瞬間にグラフィック関連の設定は保存されちゃうのでBackで適用無視して閉じても変わっちゃいます。
もっと厳密にもとに戻せる設計
動画ではやっていませんが、せっかくなのでもっとまじめに上記赤線の制限を解除する実装してみましょう。
「Event On Horiz Comp Updated」のブランチ以降の処理をなくして、その代わりに新しい関数「Setup ScalabilityChildren Index」(スケーラビリティの子供の設定欄を変えるやーつー)を作りましょう
中身はこんな感じです
最初と最後に初期化中フラグを上げ下ろしすることで、一つ設定欄が変わるごとに「Event On Horiz Comp Updated」が動くのを回避しています(なくても可)。
あとはスケーラビリティの子供のインデクスを親のインデクスに揃えているだけで、実際の設定はここでは変えていません。
実際の設定は、「Update Video Settings」関数のSequenceのThen 0に下記のように移動して、適用されたタイミングで反映されるようにしましょう。
これでまず全体のスケーラビリティが変更されて子供の設定もそれになりますが、Then7からの子供の設定もすかさず変更反映されるので細かい調整も問題なく反映できるはずです。
ウィジェット上で設定を変える段階ではグラフィック関連は変わらず、Applyボタンで適用するタイミングで反映される仕様となります。
ただし、上のほうでも触れましたが、
スケーラビリティの設定を変更後に子の設定を変更する処理がひとつでも動くと、「Custom」-1という情報が保存される仕様のようです。
すると、結果的に一旦Option画面を閉じて開きなおすと「Low」表記になります(その設定メニュー上の見た目だけの問題で、子供の設定が正しいので問題はないです)
それも気にする方は「Update Video Settings」関数で子供の設定を変えるときに親と設定欄が同じか違うか判定を追加する、か、
前回どれが選択されていたかの情報を別途保存しておいて、設定画面上にはその情報を参照する
みたいなケアが必要かなと。。。
めんどくさい(><) というわけで本記事では割愛します。
コメント