そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

Claude Code が停止したタイミングで音を鳴らす方法

要件

macOS Sequoia 15.6

はじめに

Mac のターミナルで Claude Code を使っていると、
コマンドの実行許可待ちや作業完了に気づかず、しばらく放置してしまうことがあります。

そこで今回は、Claude Code が停止したタイミングで Mac の通知音を鳴らす方法を紹介します。

対象は以下のタイミングです。

  • コマンド実行の許可を求められたとき
  • Claude Code の作業が完了したとき


方法

claudeのsettings.json を編集することで設定できます。

以下の順番で説明します。
1.settings.jsonを開く
2.settings.jsonを編集する

1.settings.jsonを開く

Finder でホームフォルダを開く

ホームフォルダは、Finder を開いてショートカットキー入力で開けます。

Shift + Command + H


隠しファイルを表示する

ホームフォルダを開いた状態で、以下のキーを押します。

Command + Shift + .

これで、通常は非表示になっているフォルダも表示されます。


.claude フォルダを開く

ホームフォルダの中に.claudeのフォルダがあるはずです。
こちらを開きます。

もし .claude フォルダがない場合は、
新規フォルダを作成して、名前を .claude に変更します。


settings.json を開く

.claude フォルダ内にあるsettings.jsonのファイルを開きます。


2.settings.json を編集する

コード内容

settings.json の内容を、以下のようにします。
元から入っているコードがある場合は、
ChatGPTなどのAIに下記に変更してよいか確認すると良いでしょう。

{
  "theme": "dark",
  "hooks": {
    "PermissionRequest": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "afplay /System/Library/Sounds/Funk.aiff",
            "async": true
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "afplay /System/Library/Sounds/Glass.aiff",
            "async": true
          }
        ]
      }
    ]
  }
}

保存後、Claude Code を一度終了して、再起動すると反映されます。
(Claude Codeが起動中で次のプロンプト入力待ちの状態で保存しても無事反映されました。)


コード内容の簡単な説明


"PermissionRequest"

Claude Code がコマンドの実行許可を求めてきた時に実行されます。


"Stop"

Claude Code の作業が完了した時に実行されます。


"afplay /System/Library/Sounds/Funk.aiff"

Mac 標準の音声ファイルを再生しています。


"async": true

音を鳴らす処理をバックグラウンドで実行する設定です。


音を変更したい場合

音を変えたい場合は、以下の部分を変更します。

"command": "afplay /System/Library/Sounds/Funk.aiff"

例えば、Funk.aiffPing.aiff に変えると、別の音になります。


Mac 標準の通知音一覧

Mac 標準では、以下のような音が使えます。

| 音声ファイル | 音のイメージ |
|---|---|
| `/System/Library/Sounds/Basso.aiff` | 低めの「ブー」という音。警告っぽい印象 |
| `/System/Library/Sounds/Blow.aiff` | 息を吹くような「フッ」という音 |
| `/System/Library/Sounds/Bottle.aiff` | ビンを軽く叩いたような「ポン」という音 |
| `/System/Library/Sounds/Frog.aiff` | カエルの鳴き声のような「ゲコッ」という音 |
| `/System/Library/Sounds/Funk.aiff` | 低めで目立つ「ボン」という音。許可待ちに気づきやすい |
| `/System/Library/Sounds/Glass.aiff` | ガラスを軽く叩いたような「チン」という音。通知音らしい |
| `/System/Library/Sounds/Hero.aiff` | 明るめの「ピロン」という音。完了通知向き |
| `/System/Library/Sounds/Morse.aiff` | モールス信号のような「ピピッ」という音 |
| `/System/Library/Sounds/Ping.aiff` | 高めの「ピン」という短い音。シンプルで使いやすい |
| `/System/Library/Sounds/Pop.aiff` | 軽い「ポップ」という音。控えめ |
| `/System/Library/Sounds/Purr.aiff` | 猫が喉を鳴らすような低めの「ゴロゴロ」音 |
| `/System/Library/Sounds/Sosumi.aiff` | Macらしい昔ながらの通知音。「ピロッ」という印象 |
| `/System/Library/Sounds/Submarine.aiff` | 潜水艦のソナーのような「ポーン」という音 |
| `/System/Library/Sounds/Tink.aiff` | 小さく高い「チン」という音。かなり控えめ |
例えば、作業完了時の音を `Ping.aiff` にしたい場合は、以下のように変更します。


注意点

settings.json は JSON ファイルなので、コメントを書くことはできません。

以下のような書き方はできません。

{
  // これはコメント
  "theme": "dark"
}

メモを残したい場合は、
settings.json とは別にメモ用のテキストファイルを作るのがおすすめです。

例:

settings_memo.txt


終わりに

この設定を入れておくと、Claude Code が止まったタイミングで音が鳴るようになります。

一気に便利になる感覚があるのでオススメの設定です。

お役に立てましたら幸いです。

【Unity】AI開発 機密情報の方針メモ

はじめに

Unity開発でAIに機密情報を読まれるのが気持ち悪いため、どう対応するかの自分用メモです。

前提知識

・AIは起動フォルダの外は読まない
Aフォルダを対象にClaude Codeなどを起動した場合、
権限を与えない限りAフォルダ以外は読まない。
→ 機密ファイルを起動フォルダの外に置けば、それだけで読まれない。

・機密情報を.envファイルに逃がしても「実行時」は読まれる
実行時に機密情報を渡すよう.envファイルを作っても、
AI経由でUnityを直接操作(プレイモード起動など)するなら、
実行時に機密情報がメモリ/ログに乗って読まれてしまう。
→ 「ファイルに書かない」だけでは不十分。
そもそもプロジェクト内に持ち込まないのが確実。

プラットフォーム別

各OS固有の機密情報(証明書・署名キーなど)の扱い。

Steam

Mac用:特になし
Windows用:特になし

Android用

証明書類(カスタムキーストアファイル、キーストアパスワードのメモ)を
プロジェクトフォルダに入れない。

iOS用

証明書関連(Apple Developerのページで作成する類)を
プロジェクトフォルダに入れない。

サーバーサービス別

Unityプロジェクト本体とは別に、サーバーサービス側にも機密情報がある。
ここでは Android・iOS のバックエンドに使っている PlayFab について書く。

PlayFabに関する情報の扱い

PlayFabを使用するにあたり、機密にあたるのは次の2つ。

・ Developer Secret Key
役割:
タイトル(ゲーム1本)ごとに発行される、サーバー用の親鍵。
これを使うと、管理者として何でもできる
(全プレイヤーのデータ閲覧・書き換え、通貨やアイテムの配布、BAN、カタログ変更
本来サーバー側だけで使うもので、プレイヤーが遊ぶクライアント(アプリ本体)には不要。

流出したらどうなるか:
そのゲームのバックエンドを乗っ取られたのと同じ。
全プレイヤーの個人情報を抜かれたり、データを書き換え・全削除されたりする。
被害をそのタイトル内で止められない、最悪クラスの鍵。


・ dev account token
役割:
「Unity 用エディター拡張機能」にログインしたときに保存される、自分(開発者アカウント)のログイン情報のキャッシュ。
毎回ログインし直さなくて済むようにするための、いわば保存済みのログインセッション。
ゲーム本体の動作には関係なく、開発ツール側だけで使われる。

流出したらどうなるか:
あなたの開発者アカウントとして PlayFab を操作される。
そのアカウントが持つゲーム(複数あれば全部)に影響しうるため、被害が1タイトルに収まらない危険がある。
Developer Secret Key と並んで、最優先で守るべき情報。


補足:
逆に Title ID は公開前提の識別子なので、機密ではない(読まれても問題なし)。
守るべきは上の2つ、として以下を考えている。

・新規導入する場合(これから入れる場合)

・「Unity 用エディター拡張機能」は使わない。
・Developer Secret Key は入力しない。

SDKは下記の手順(エディター拡張なし)で導入し、Title IDだけ入力する。
Title IDのみの入力で問題なし。
Title IDは公開前提の識別子なので、AIに読まれても問題なし。

learn.microsoft.com


・すでに「Unity 用エディター拡張機能」を利用中の場合

Developer Secret Key:削除する。
場所:PlayFabSharedSettingsファイル > Developer Secret Key
これはPlayFab管理画面の設定をいじる類のキーのため不要。


dev account token:削除する。そしてエディター拡張タブでログアウトする。

注意:これはエディター拡張のログインのキャッシュ。
再ログインすると書き戻されるので、「消す+以後ログインしない(=拡張機能を使わない)」までセットで対応する。ランタイム/ビルドには無関係なので、消しても実害なし。

隠すのをやめた情報

隠すのをやめたのは次の通り。

Mac・iOS用の「チームIDに署名」欄
AdMob のアプリID(App ID)
AdMob の広告ユニットID(Ad Unit ID)

Mac・iOS用の「チームIDに署名」欄

理由:そこまで重要ではない/対策を打つのが面倒なため。

AdMob のアプリID・広告ユニットID

理由は以下の2つ

・そもそも公開アプリに埋め込まれる識別子だから
アプリIDはビルド時に AndroidManifest.xml / Info.plist に書き込まれ、
広告ユニットIDはC#コード内に書く。どちらも必ずビルドに含まれる。
配布したAPK/IPAを解析すれば誰でも取り出せるので、
「隠す」こと自体が原理的に成立しない。公開前提の情報。
→ PlayFabの Title ID と同じ位置づけ。

・流出しても乗っ取り・金銭被害に直結しないから
これらはあくまで「どの枠に広告を出すか」を指す識別子で、
管理画面のログイン情報でもAPIキーでもない。
IDを知られただけで、AdMobアカウントを操作されたり収益を抜かれたりはしない。
→ PlayFabの Developer Secret Key とは別物。

補足:
理論上は、他人が自分の広告ユニットに不正なインプレッション/クリックを送り、
Googleにアカウントを停止させる「広告詐欺」の懸念はある。
ただしIDは公開アプリから抜ける以上、AIに読まれるかどうかとは無関係。
わざわざ隠す労力に見合わないと判断した。

【Unity】略称UTSの最新は Unity Toon Shader であるという話

はじめに

ユニティちゃんトゥーンシェーダーの最新が使いたかったのですが、
略称のUTSで検索すると古いシェーダーの情報が出てきてしまい混乱します。
そこで自分用にちょっとまとめました。

結論

最新の名称は「Unity Toon Shader」です。

docs.unity3d.com

バージョンと呼び方まとめ

大雑把に分けると下記のようになります。

Ver1(初代)

  • ユニティちゃんトゥーンシェーダー
  • 略称:UTS(非公式・通称)

Ver2(UTS2系)

  • ユニティちゃんトゥーンシェーダー2.0
  • UTS/UniversalToon(UTSのURP版はこちらで呼ばれる)
  • 略称:UTS2(通称)

Ver3(現行・公式後継)

  • Unity Toon Shader
  • 略称:UTS(非公式で使われることあり)

【Unity】VRM1.0 のリップシンクをする uLipSync

要件

Unity: 6000.3.2f1
UniVRM: 0.108.0
URPプロジェクト

はじめに

音声を解析してキャラクターの口を動かす uLipSync を、
UPM(Package Manager)経由で導入し、
VRM1.0モデルに適用するメモです。

github.com

1.uLipSyncの導入

uLipSync は いろいろな導入方法がありますが、
今回は UPM(Package Manager)で導入します。

1-1. UPM(Package Manager)前準備

→編集
→プロジェクト設定


→パッケージマネージャー
こちらでパッケージの場所を指定します。


下記を入力して保存を押します。
名前:hecomi-npm(なんでもいいです)
URL:https://registry.npmjs.com
Scope(s):com.hecomi
→保存


1-2.パッケージマネージャーからインストール

→ウインドウ
→Package Management
→パッケージマネージャー


→マイレジストリ
→hecomi-npm(先ほどつけた名前)
→uLipSync
→インストール


パッケージが署名されていないというウインドウが出た場合は
「パッケージマネージャー」のボタンを押します。


これでインストール完了です。


2.uLipSyncのVRMサンプルを使用できる状態にする

VRMを動かすサンプルのダウンロード後、
プロジェクト設定を少し変更し、サンプルを使える状態にします。

2-1. VRM サンプルをダウンロード

uLipSyncではサンプルが複数用意されているためこちらを活用していきます。

パッケージマネージャーのuLipSyncを表示した状態
→サンプル
→04. VRM
→インポート


インストール後、プロジェクトタブにサンプルのフォルダが表示されます。

2-2.プロジェクト設定変更

今回、VRM1.0を使用するということで設定が必要です。
→編集
→プロジェクト設定


→プレイヤー
→スクリプトコンパイル
→「+」ボタン


→「USE_VRM10」を入力
→「適用する」を押す

以上で準備完了です。


3.サンプルを動作させる

3-1.サンプルを開く

先ほどインポートした「04.VRM」フォルダの「04-2.VRM1.0」シーンを開きます。

3-2.同梱モデルのマテリアルを変更

URPプロジェクトの場合はマテリアルが対応しておらずピンク色になってしまいます。
修正するには下記の手順でマテリアルの設定を変更してください。
→04.VRMフォルダ
→VRMフォルダ
→1.0フォルダ
→ uLipSync-VRM1 をクリック
→インスペクターの上部「Materials」をクリック
→Render Pipeline を「Universal Render Pipeline」へ変更
→「適用する」をクリック

モデルがエラーなく表示されました。

3-3. 3つのコンポーネントを設定

リップシンクを行うにあたり、
VRMオブジェクトに追加が必要なコンポーネントは次の3つです。
・Audio Source(音声ファイルを再生する)
・U Lip Sync(メインのリップシンク処理コンポーネント)
・U Lip Sync Expression VRM(VRM の表情に反映する)

サンプルのオブジェクトには追加済みとなっています。
リップシンク実現に向けた必要な設定していきます。

3-3-1.Audio Source コンポーネント

Audio Source には再生する音源を登録します。

プロジェクトに使用したい音源をインポートし、
Audio Source コンポーネントのAudio Generator 欄に割り当てます。


3-3-2.U Lip Sync コンポーネント

U Lip Sync コンポーネントは、
音源を解析して指定のプログラムに情報を伝達するコンポーネントです。

まずは、プロファイルの設定を行います。
プロファイルとは?
音声解析結果を“どの口形(Viseme)にどれだけ反映するか”を決める設定データです。

プロファイルデータはサンプルを用意していただいているので
サンプルをそのまま使用します。
→「プロジェクト」タブ
→Packages
→uLipSync
→Assets
→Profiles
→uLipSync-Profile-Sample-Female をプロファイル欄に割当て


割当て後はこのように表示されます。


次に解析情報を伝える設定をします。
実はすでに登録済みなのですが、モデルが変わった時に設定が必要なため書いておきます。

設定する箇所は画像の部分です。


これは下記の情報を登録する内容になっています。
・動作させたいオブジェクトを指定
・どのコンポーネント の どの処理かを動かすか を指定

設定を解除して最初から登録すると次のようになります。

動作させたいオブジェクトを指定


処理内容を指定
→「U Lip Sync Expression VRM」コンポーネントの「OnLipSyncUpdate」を登録


3-3-3.U Lip Sync Expression VRM コンポーネント

U Lip Sync Expression VRM コンポーネントは、
VRMの表情にアクセスするコンポーネントです。

表情に反映する強さを変更することができます。

たとえば、母音の"A"成分をなくしたい場合は、該当する値を0にすることで実現可能です。

実際に実行して調整することになるでしょう。

4.確認

実行してリップシンクしていることを確認します。

おわりに

手軽にリップシンクができてしまうuLipSyncに感謝です。

この記事がなにかお役に立てましたら幸いです。

【Steamworks】アプリデータをアップロードすると Error code was 9 Error text: Did not receive entire file というメッセージが出る

内容

Steamworks上でアプリデータをアップロードしたところ、
以下のメッセージがでました。
・Error code was 9
・Error text: Did not receive entire file

こちらはWindowsMacの両OSで発生しています。

対策

エラーの原因はSteam側の不具合のようで、
対策は「数時間後に何度かアップロードしてみる」になります。

今回の場合、12時間後に数回アップロードを試みたところ、
3回目のトライでアップロードに成功しました。
1回目:同様のエラー
2回目:同様のエラー
3回目:アップロード成功

同じエラーが出た方の参考になれば幸いです。

【Unity × Google AI】無料で使えるのは今だけ?Antigravityで爆速開発環境を作る方法

要件

Unity 6000.0.58f2

はじめに

無料で自動コーディングができるということで
Google のAIエディタ「Antigravity」を導入して簡単なゲームを作ってみました。

ダウンロード方法から実際にゲームが動くところ試した過程を残します。

ダウンロード方法

ダウンロードできるページはこちらです。 antigravity.google



ダウンロードボタンを押します。



PCに応じたファイルをダウンロードしてください。


エディタセットアップ

エディタを起動したら初期設定の画面になりますので進めていきます。
全6ステップです。



まずはNextを押して進めます。


1.エディタ設定インポート

IDEの設定インポートする?的なことを聞かれます。
私はVS Codeは使用していないため「Start fresh」で進めました。


2エディタテーマの決定

エディタのテーマ(デザイン)を決めます。 私は「Drak」を選択。



3.開発方針の設定

次はどの程度AIが勝手に進めるかの方針を選択します。

左側の項目を選択することで右側の方針設定が変わるようになっており、
以下の4つが用意されていました。
・Agent-driven development - AI主導型開発
・Agent-assisted development - AI支援型開発
・Review-driven development - レビュー主導型開発
・Custom configuration - カスタム構成

私はバランスが良さそうな「Agent-assisted development」を選択しました。

右側の3項目の内容は以下となります。
1. Terminal execution policy(ターミナル実行ポリシー)
 ・Turbo:ユーザーの確認なしに進める
 ・Auto:安全なコマンドと判断された場合にのみ自動で進める
 ・Off:コマンドを実行しない
 
2. Review policy(レビューポリシー)
・Always proceed:AIは一切レビューを要求せず、自律的に次のステップへ進みます。
・Agent decides:AIはレビューが必要な場合にのみ要求します。
・Request review:AUは常に人間のレビューを要求してから次のステップへ進みます。

3. Use the default allowlist for the browser(ブラウザのデフォルトの許可リストを使用)
 エージェントがインターネット上の情報にアクセスする際のセキュリティ設定です。
 あらかじめ安全性が確認されたドメイン(許可リスト)のみにアクセスを制限します。



4.エディタ拡張機能の設定

次はエディタの拡張機能の設定です。
3項目の設定をどうするかを決めます。私はそのまま「Next」で進めました。

項目の内容
1. Keybindings(キーバインド
 エディタで使用するキーボードショートカットの配列設定。
 Normal: 標準的なキー操作パターン。
 Vim: テキストエディタVim向けのターン。Vimに慣れている開発者向けです。

2. Extensions(拡張機能
 Antigravityエージェント機能の一部に必要な「一般的な言語拡張機能」を、
 この時点でインストールするかどうかを設定します。

3. Command Line(コマンドライン
 Antigravityをコマンドラインから起動・操作するためのツールのインストール設定です。



5.Googleでサインイン

Googleアカウントでサインインします。



6.利用規約に同意

利用規約はざっくりと以下が書いてあります。

注意点(ユーザーに求められる行動)
・Antigravityには特定のセキュリティ上の制限があることを認識すること。
・データ流出や意図しないコード実行を含む潜在的なリスクに注意すること。
・機密性の高いデータを処理することは避けること。
AUが実行したすべてのアクションを必ず確認(Verify)すること。

同意事項(データ収集に関する承諾)
Googleが、Antigravityの利用を通じて発生した操作データを収集し、利用すること。
・データの利用目的は、GoogleとAlphabetの研究、製品、サービス、
 および機械学習技術の評価、開発、改善のためであること。


利用規約の画面から進めると管理者権限を要求されます。
「OK」を押して進めます。


左下にインストールしてますのコメントが表示されるため消えるまで待ちます。(5分ほど)

以上でセットアップは完了です!



自動コーディングで作る

ではいよいよ自動コーディングをやっていきましょう。

1.前準備 Unityの新規プロジェクトを立ち上げ

UnityでURPの2Dプロジェクトを新規で作りました。
プロジェクトは開きっぱなしで大丈夫です。

2.対象フォルダの指定

青色の「Open Folder」ボタンから先ほど作成したUnityプロジェクトのフォルダを指定します。


フォルダを指定すると「フォルダ内のファイルの作成者を信頼しますか?」と聞かれますので
「Yes, I trust the authors」をクリックして進めます。


3.指示を出す

右側のウインドウに指示を入力します。(日本語でも大丈夫です。)
今回は、「ランダムに出現する数字を1から順番に押していくゲームを作成して」
というなんとも雑な指示をしてみました。



Unityプロジェクトであることも指示が必要だったようで下記のやりとりも交えつつ進めました。
AI:Webアプリですか?Unityプロジェクトですか?
私:Unityプロジェクトです。

AI:(英語の回答)
私: 日本語で回答して

その後、スクリプトが作成され、
UI作成、プレハブ作成、ゲームマネージャーの設定方法まで提示してくれました。


UI作成も自動生成でできないか聞いてみたところ、
Unityエディタを操作するスクリプトを書くことで実現できるようです。


Unityの上部メニューバーにセットアップメニューを作ったということで
確認してみると本当にできていました。


押してみると・・・
UIやプレハブができてる・・・
すごい・・・


そして、実行してみるとちゃんと動きました。


遊んでみた動画はこちら


日本語化

日本語で進めたい方は、以下の設定で日本語化が可能です。
「エディター側の日本語化」と「AIの返答を日本語化」はそれぞれで設定が必要です。

エディターの日本語化

エディターの日本語化は、次の手順です。
→エディタ左側の四角アイコン
→検索窓に「japanese」と入力
→「Japanees Language...」をクリック
→「Install」をクリック


Do you trust the publisher "MS-CEINTL"?
(発行元「MS-CEINTL」を信頼しますか?)
というウインドウが出るため「Trust Publisher & Install」をクリックして進めます。


「Change Language and Restart」というボタンを押して再起動します。

これでエディターの英語表記が日本語になりました。


AIの返答を日本語化

AIの回答をデフォルトで日本語にするためには次の設定を行います。

→右上の三点マーク
→Customizations


→ Rules
→ +Global


→「日本語で回答してください」と入力


入力内容をセーブします。
Windows:Ctrl+S
Mac:command + S


セーブ後、GEMINI.mdファイルの右横の⚫︎のマークが×に変わります。


さいごに、「Rules」横の更新マークを押して完了です。


ちなみに、チャットメニューに戻るには「Back to Agent」で戻ることができます。

おわりに

感想としては、無料でここまで使えてよいの?という感覚です。

グーグルマップのように無料で提供することで、競合に打撃を与え、
市場で圧倒的な優位を築く戦略なのでしょうかね。

いつ有料になってもおかしくないレベルなので早めに触っておくことをオススメします。

【Unity】マテリアルのHDRカラー強さをスライダーで調整する方法

要件

Unity6000.026f1
URPプロジェクト

はじめに

マテリアルのHDRカラーの「強さ」の変更方法で少し詰まったのでメモ

まず、HDRカラーの「強さ」を設定する専用の変数は存在しません。
色のR,G,Bの値に数値を乗算することで実現します。

サンプル

using UnityEngine;
using UnityEngine.UI;

public class HDRColorController : MonoBehaviour
{
    [Header("UI")]
    [SerializeField] private Slider _colorIntensitySlider;   // HDR強度スライダー
    [SerializeField] private Image _colorImage;              // 色取得用UI(ColorPickerなど)

    [Header("Material Settings")]
    [SerializeField] private Material _backgroundImageBaseMaterial; // 操作対象のマテリアル
    [SerializeField] private string _colorPropertyName = "_Color";  // マテリアルのColorプロパティ名(Reference名)

    private void Start()
    {
        // スライダーが設定されているか確認
        if (_colorIntensitySlider != null)
        {
            _colorIntensitySlider.onValueChanged.AddListener(OnColorIntensityChanged);
        }
    }

    /// <summary>
    /// HDR強度スライダーが変更された時に呼ばれる処理
    /// </summary>
    private void OnColorIntensityChanged(float value)
    {
        if (_backgroundImageBaseMaterial == null || _colorImage == null)
            return;

        // マテリアルにプロパティが存在するか検証
        if (_backgroundImageBaseMaterial.HasProperty(_colorPropertyName))
        {
            // UIから選択された色
            Color baseColor = _colorImage.color;

            // HDR強度を2のべき乗で計算
            float factor = Mathf.Pow(2, value);

            // HDR適用(RGBのみ拡張)
            Color hdrColor = new Color(
                baseColor.r * factor,
                baseColor.g * factor,
                baseColor.b * factor,
                baseColor.a
            );

            // マテリアルに設定
            _backgroundImageBaseMaterial.SetColor(_colorPropertyName, hdrColor);
        }
    }
}


スライダーの値を2のべき乗としている理由は、
HDRの強度は「線形に上げる」よりも「指数的に上げる」方が自然なためです。
お好みによりスライダーの値をそのまま使用しても問題ありません。

            // HDR強度を2のべき乗で計算
            float factor = Mathf.Pow(2, value);

参考

https://discussions.unity.com/t/how-to-get-set-hdr-color-intensity/226028