明るさ調整の実装【Unity6】

絶対調味ロジック

画面の「明るさ」は、特に実装する予定はなかった設定です。
UIデザインをしている中で、何気なくつけてしまったので実装してみました。

ビデオカメラを模したUIに方向性が固まりました。

明るさ調整の実装は、お馴染みClaudeさんにお願いしました。
明るさ」に対して「PostProcessing」を使用するので、ちょっと心配になりましたが、
今回はさらっと実装してくれて助かりました。

概要

  • URPPost Processing(Color Adjustments / Post Exposure)を使用した明るさ調整機能
  • DontDestroyOnLoadGlobal Volumeを専用マネージャーで管理し、全シーンに一括反映する
  • 各シーンのローカルVolume(Vignette等)は一切触らない設計

設計方針

  • 各シーンのローカルVolumeには Color Adjustments を追加しない
  • 専用の Global Volume を1つ作成し、DontDestroyOnLoad オブジェクトに乗せる
  • ローカルVolumeとの競合を避けるため、Global VolumeのPriorityは低め(0)に設定
  • 値の保存は既存の「Sys_Flag_Manager」に SYS_ プレフィックスで保存し「global_system.json」に永続化

スクリプト(新規・修正)

Sys_BrightnessManager.cs(新規)

  • 明るさ(Post Exposure)の読み書きを一元管理する
  • DontDestroyOnLoadなルートオブジェクトにアタッチする
  • Global VolumeコンポーネントをInspectorからアサインして使用
  • Color AdjustmentsがVolumeProfileに未追加の場合は自動でAddする
  • スライダー値(0〜100) → Post Exposure(-3.0〜+3.0) に変換して適用
  • 値の保存先キー:SYS_BRIGHTNESS(global_system.json)
  • デフォルト値:50(Post Exposure = 0.0、変化なし)
メソッド内容
GetBrightness()現在の明るさ値(0〜100)を取得
SetBrightnessImmediate(int)値を保存しMixerに即時反映
ResetToDefault()デフォルト値(50)に戻して保存
ApplyBrightness()保存済みの値をVolumeに反映
ConvertToExposure(int)スライダー値→Post Exposure変換(static)

UI_SystemSettingsPanel.cs(修正)

  • 既存のウィンドウ・解像度設定UIに明るさスライダーを追加
  • Inspectorアサイン:brightnessSlider(Slider)/ brightnessValueText(TextMeshProUGUI)
  • RefreshAll()でパネルを開いたときに現在値を反映
  • リセットボタン(btnReset)押下時にBrightnessManagerのResetToDefault()も呼ぶ
  • onValueChanged の二重発火防止のため、RefreshAll時はリスナーを一時解除して再登録

Unity設定手順

  1. ルート直下に「Brightness_Manager」という名前で空のGameObjectを作成
  2. Volumeコンポーネントを追加し以下のように設定する
    ・Is Global:ON
    ・Priority:0
    ・Profile:新規作成(例:BrightnessProfile)
    ・Profileに「Color Adjustments」を追加(Post Exposureのみ使用)
  3. Sys_BrightnessManager.csをアタッチし、Global VolumeフィールドにVolumeをアサイン
  4. SystemSettings_CanvasにSliderとTextMeshProを追加
  5. UI_SystemSettingsPanelの各フィールドにアサイン

実機での挙動

ポストプロセスを使用しましたが、今回の「明るさ」だけを独立してもらえたので、
既存の各Sceneの設定と被らずに安全に実装することができて満足です(*´ω`*)

ついでにちょろっと、
メイン画面に常備しようとしているスライダーとのリンクも試してみました。
これも独立型で、既存設定とのリンクもしてもらえたので、UIデザインそのままの想定挙動ができそうです♪

補足・注意事項

  • UICanvas(Screen Space – Overlay)はPost Processingの対象外のため、
    明るさ調整はUI以外(背景・立ち絵等)のみに影響する。
    ノベルゲームとしてはテキストの可読性を損なわないため、この挙動が正しい。
ジャンルUIへの影響一般的か
アクション・RPG・3DゲームUIに影響しない✅ スタンダード
ノベルゲーム背景・立ち絵のみ明るくなり、テキストウィンドウは変わらない✅ むしろ理想的
映像系・シネマティック全体にかけたい場合もある要件次第
  • Post Exposureの範囲(-3〜+3)は
    Sys_BrightnessManager の EXPOSURE_MIN / EXPOSURE_MAX 定数で変更可能。
  • Sys_SystemSettingsManager.cs は変更なし。

コメント