BGM管理 2系統になっている問題の対策検討(根本的にはホーム画面BGM停止問題対策をシンプルに)
Description
現在の問題として、すべてBGMは、CDNからDLして再生しているにも関わらず、ホーム画面のデフォルトBGMだけ特別扱いで、管理の論理が一本化されておらず、2系統存在しており、BGM再生論理が歪んでいる。BGM停止しやすい問題の根本要因もこの管理のしづらさ、論理の導きにくさにもある。 この対策を検討する
Comments (6)
ホーム画面のデフォルトBGMも、すべて、Luna BGMで 統一し、管理も1本化 するのが、1番 コスト少なくてシンプル と考える
ただし、実務的な確認点がいくつかある
なぜシンプルになるか
Before(現状)
┌─ Default ─→ R2 (R2.assetsOrigin) + サーバー home-assets.ts が無条件返却 + bundle 所有
└─ Luna ───→ supabase + client が動的 add + dynamicallyAddedBgmAliasRef 所有
After(統一)
└─ 全部 Luna ─→ supabase + client が `bgmId` を見て一律処理(特例ゼロ)
消えるもの:
home-assets.ts:26の無条件追加Home.tsx:454-461の useMemo フォールバック分岐Home.tsx:504-506の Luna→null 時の即 playBGM 特例HomeCharacterSelectModal.tsx:180の同様の特例constants/bgm.tsのBGM.HOMEの存在意義(Home に閉じてるなら)preload.ts:462-469の "再生中BGM保護" を default で意識する必要性
→ Home BGM 周辺コードがざっくり半分以下になる見込み。
1. 問題背景
INS-833 でバグ調査した結果、表面的な「BGM 設定変更時のエラー」だけじゃなく、もっと根本的な構造的な歪みがあることが分かった。それを共有して、対応方針を決めたい。
2. 構造的な歪み(具体的に2つ)
(1) BGM の管理が path 系と URL 系の2系統で並走している。
- ゲーム本体の BGM(Home / Caravan / Result / Title / Gacha / バトル / チャプター)は path 表現 で管理されている (例:
"sounds/bgm/home.m4a")- Luna Editor 経由の BGM は URL 表現 (例:
"https://...supabase.co/...")- 両方とも CDN ダウンロードでアプリ内蔵ではないので、本質的には同じものだが、実装上は完全に別経路で扱われている。
(2) 同じ非同期パターン(ロード→ポーリング→再生)が複数シーンに重複コピペされている。
- Home.tsx、HomeCharacterSelectModal.tsx の2箇所に、同じ ~20行のポーリングコードが個別実装されている
- もしバグが見つかったら、両方を直さなければならない
3. これが引き起こしている実害
- INS-833 のような「デフォルト BGM の設定変更でアサーションエラー」が出るのは、2系統の特例ロジック(default は常駐前提)が crossfade lifecycle と矛盾するため
- 現在、別件だが、キャラバン / ガチャ / 祈願で似た BGM バグが起きている(再現性が低くて未追求のものを含む)
- 新しい BGM 機能を追加するたびに、どっちの系統で管理するか考えるコストが発生する
4. 提案する方向性
(a) BGM 再生を単一のヘルパー関数 (
playBgmAfterLoad) に集約する
- 重複した非同期パターンを一箇所に統合
- 新規追加・修正時の影響範囲が局所化
(b) BGM 表現を URL に統一する(段階的に)
- ゲーム本体側の BGM も Luna 系と同じ URL ベースに揃える
- これによって、ヘルパーを通じた完全に対称な扱いが可能になる
- 副次的に「
SoundAssetPath型」「asset-manifest.json」「マスタデータのbgmPath」などの整理も必要になるが、これらは段階的に進められる
5. 段階的アプローチ(リスク管理)
一気に全部書き換えるのではなく、フェーズ分け:
- フェーズ 0(今すぐ): INS-833 のエラーをヘルパー導入で塞ぐ(モーダル / Home.tsx の 2箇所)
- フェーズ 1(次): Home BGM だけ URL 化、検証
- フェーズ 2(その後): Caravan / Result / Gacha / Title を順次 URL 化
- フェーズ 3(最後): バトル / チャプター BGM をマスタデータごと URL 化
各フェーズ独立して deploy・検証可能で、問題があれば次に進まない判断ができる。
260617 代表との相談により、ファイルパス preload 廃止 → URL preload 再生 統一化の方向で BGMサウンドシステムを修正していく。現在のバグも修正し、今後のバグもおきにくいように。また、これまで実装したファイルパスpreloadならこれ、URLpreload再生ならこれといった、複雑な論理をシンプル化していく。
BGMとして、ファイルキャッシュする必要性がないなら、2系統の問題は改善した方がよい。もしファイルキャッシュの必要性があるのなら、場合によっては修正しなくてよい?