← Back to listPhase 4**:**
INS-806
Phase 4 修正案検討
StatusDone
TeamInstansys
Assigneeasuki.uehata@instansys.co.jp
PriorityMedium
Created2026/05/22 08:10
Completed2026/05/22 08:13
Archived2026/05/30 03:54
Description
Phase 4**:** setBGMVolume 改修(P5 部分対応)
- 走行中の fade timer があれば clear(fade の目標音量がユーザー設定と矛盾するので)
- 現状の
_bgmInstance.volume = volume設定はそのまま
ただしこれは挙動変更を伴う(fade 途中で音量変えると即時反映になる)ので、慎重判断:
- 案A: setBGMVolume では fade を止めない(最終
_bgmVolumeを更新するだけ、fade interval がthis._bgmVolumeを読みに行く設計に変える) - 案B: setBGMVolume で fade を止める(即時反映優先)
Comments (1)
asuki.uehata@instansys.co.jp2026/05/22 08:12
setBGMVolume の実用途は以下の3つだけです。「fade 中に音量を変える」という意図的な設計は存在しません。たまたまタイミングが重なる可能性があるだけです。
setBGMVolume 呼び出し全実態
| # | 呼び出し元 | 目的 | 発火タイミング |
|---|---|---|---|
| 1 | sound-settings.ts:80 | ユーザーが設定モーダルで BGM 音量スライダーを動かした / mute トグル | ユーザー操作(任意のタイミング) |
| 2 | Battle.tsx:382 | バトルクリア時の ダッキング: CLEAR_SE 再生中 BGM を 30% に下げる | バトルクリア演出開始時 |
| 3 | Battle.tsx:386 | ダッキング解除: 元の音量に戻す | CLEAR_SE 再生終了時 |
| 4 | Battle.tsx:499 | クリア演出スキップ時のダッキング即解除 | ユーザータップ |
各ケースが fade と衝突しうるか?
| # | crossfade 進行中と重なる現実的確率 |
|---|---|
| 1 (設定変更) | 低: ただしシーン遷移直後に開いて即操作する可能性ゼロではない |
| 2-4 (ダッキング) | ほぼゼロ: バトル開始時の crossfade はとっくに完了している。Battle 内で BGM 切替は起きない |
→ 「fade 途中で音量変える」のは設計上想定された挙動ではなく、タイミングが重なった時の偶発的事故。
紛らわしさを根絶する設計案
_bgmVolume を 「ユーザー意図の目標値」 として位置づけ、fade と volume の責務を分離します:
_bgmVolume : "今の目標音量"(ユーザー設定 or ダッキング値)
setBGMVolume は ここだけ更新する
fadeIn/fadeOut : 「0 ⇄ _bgmVolume の間を ramp する」役割
各 step で _bgmVolume を都度参照(目標値追従)
非fade時の volume: _bgmInstance.volume = _bgmVolume を直接書く
これが達成されると:
- fade 中に setBGMVolume が来ても → ramp の目標が動的に変わるだけ。衝突しない。
- ダッキング中に crossfade が来ても → 新 BGM は _bgmVolume (= 0.3) を目標に fadeIn する。これも自然。
- 「fade を止める / 止めない」の判断自体が不要になる。
副次効果
- P5 (setBGMVolume race) が構造的に消滅: 「fade と volume の責務が分かれている」ので衝突概念がない
- ダッキング後に crossfade が完了したとき、新 BGM が duck 状態のまま再生される(自然な挙動)
注意点
- 現状のダッキングは「
_bgmInstance.volume = 0.3を直接書く」挙動なので、即座に音量が下がる - 新設計でも同じ即時性を保つには、fade 中でなければ
_bgmInstance.volume = _bgmVolumeを即座に反映する処理を入れる(=現状維持) - fade 中なら ramp 目標が変わるだけで、聴感上はスムーズに 30% へ収束する → むしろ自然
「fade 中の setBGMVolume」は 意図された機能ではないので、衝突しない設計(責務分離)にするのが筋。Phase 4 の論点A/B のうち、論点A(fade を止めず、fade が _bgmVolume を都度参照) がこの方向に一致するか?
volume の責務分離 を推進していく