やられボイスが デバッグ バトルで 鳴らない問題解析
Description
代表からの指示による。解析ログをここに記す INS-837に付随して。
デバッグモード アカデミー最初のバトルで、やられボイスがならない。
ロード状況 指定URLの プリロードまでは成功
音がならないので、Volumeチェック
Comments (9)
プリロード成功 safari console スニペット実行結果。
使用スニペット 3種類
⭐️ iOS 実機 Safari consoleコマンドで 起動時に戻すリセット
Capacitor.Plugins.CapacitorUpdater.reset()
⭐️メモリ/バッファでもってるAudio一覧
Object.keys(window.__pixiSound._sounds)
⭐️Volumeチェック
({
battleVoice: window.__sm._battleVoiceVolume,
master: window.__sm._masterVolume,
ctx: window.__pixiSound.context.audioContext.state,
})
結果、ログ抜粋
14
がロードされていた。 でも聞こえない。
システムの方のVolume も問題なさそう。プリロードもされてはいそう。 再生がされていないか、どうか。。
``` ⚡️ TO JS {"status":200,"data":[{"result":{"data":{"json":{"characters":[{"totalExp":28050,"level":34,"updatedAt":"2026-06-10T11:47:56.816Z","playerId":"2EEfjRQFnhcojWCWPgCQw6RoD253","totalAwakenings":0,"temporaryExp":0,"combinedTotalExp":28050,"id":19,"intimacyPoin ⚡️ [log] - [Battle] preload enemy defeat voices, count= 2 ⚡️ [log] - [shortSound.preload] alias=https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/94c86703-52c7-43fc-b154-15ec6fbcec12/4f71a57f-95c9-4fc6-811c-246dcd643508.m4a existed=false ⚡️ [log] - [shortSound.preload] alias=https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/ee1d4658-625f-4b2c-8e13-e068a7d7da10/ebf0a298-4882-4f59-9080-0f479e4da088.m4a existed=false
[enemy-defeat-voice] play のログが出ていない = playEnemyDefeatVoice が呼ばれていません。
preload は2件きちんと走っているのに、やられた瞬間の play 呼出経路に到達していないということ
のようだ
やられボイスは、 ボイスの再生までは、検証している実装ではなさそう。主にグラフィック面での実装がメインだったようだ。ということで私の方で、やられボイスの再生問題は解消していく
shortSound用の新しいAPIで、やられボイスをならす。
役割分担(X 案の最終形)
| ファイル | 責務 | 状態 |
|---|---|---|
| Battle.tsx | preload と release(メモリ管理) | ✅ Step 2 で実装済み、変更なし |
| Enemy.tsx | play 発火(やられ時のトリガー) | ⏳ Step 3a で新規追加 |
つまり:
- preload は Battle.tsx で発火する(現状のまま)
- バトル開始時に spawn 情報から全敵の voice URL を集めて
shortSound.preloadを一括呼出 - バトル離脱時の useEffect cleanup で
shortSound.release一括呼出 - これが「集中管理」の意味
- バトル開始時に spawn 情報から全敵の voice URL を集めて
- play は Enemy.tsx で発火する(Step 3a 新規)
- 各 Enemy.tsx が自分の
live.stateを監視し、"dead"への transition 時にplayEnemyDefeatVoiceを呼ぶ - 内部で
shortSound.play(url)が走る - 呼出時にはもう preload 済み(バトル開始時に Battle.tsx が事前ロード済み)なので即座に鳴る
- 各 Enemy.tsx が自分の
なぜこう分けるか
- preload は「バトル全体で一括」が効率的(ロード猶予を最大化、ロジック集中)
- play は「個別の敵の死亡」で発火するので Enemy.tsx 内が自然(生死状態を持っているのは Enemy.tsx)
両者の責務を分離した方が見通しが良い
INS-836 Enemy.tsx で dead transition 時にやられボイス発火
playEnemyDefeatVoice の呼出が AnimationDebug.tsx のプレビュー用しか
存在しておらず、バトル中の Enemy.tsx から発火されていなかった (機能未実装)。
Enemy.tsx に useRef + useEffect で enemy.state の "dead" 立ち上がりを
検知する仕組みを追加し、shortSound 経由でやられボイスを発火する。
manualControl 経由の手動 "dead" 切替 (AnimationDebug) は既に
AnimationDebug 側で playEnemyDefeatVoice を呼んでいるため、
!isManualControl ガードで二重発火を回避。
私が今回APIを実装する前から、ヤンキー やられボイス ならない問題があったが、新しいAPIを実装し、なおかつ、そのAPIで、音がちゃんとなるようになり、バグも改善した。
[Log] [enemy-defeat-voice] play (index-Dk_n8-Sf.js, line 16) "https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/94c86703-52c7-43fc-b154-15ec6fbcec12/4f71a57f-95c9-4fc6-811c-246dcd643508.m4a" [Log] [shortSound.play] sound.play alias=https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/94c86703-52c7-43fc-b154-15ec6fbcec12/4f71a57f-95c9-4fc6-811c-246dcd643508.m4a usedRetries=0 (index-Dk_n8-Sf.js, line 16) [Log] [enemy-defeat-voice] play – "https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/94c86703-52c7-43fc-b154-15ec6fbcec12/4f71a57f-95c9-4f…" (index-Dk_n8-Sf.js, line 16) "https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/94c86703-52c7-43fc-b154-15ec6fbcec12/4f71a57f-95c9-4fc6-811c-246dcd643508.m4a" [Log] [shortSound.play] sound.play alias=https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/94c86703-52c7-43fc-b154-15ec6fbcec12/4f71a57f-95c9-4fc6-811c-246dcd643508.m4a usedRetries=0 (index-Dk_n8-Sf.js, line 16) [Log] [enemy-defeat-voice] play – "https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/ee1d4658-625f-4b2c-8e13-e068a7d7da10/ebf0a298-4882-4f…" (index-Dk_n8-Sf.js, line 16) "https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/ee1d4658-625f-4b2c-8e13-e068a7d7da10/ebf0a298-4882-4f59-9080-0f479e4da088.m4a" [Log] [shortSound.play] sound.play alias=https://utsaqkhxqllqkazxzhow.supabase.co/storage/v1/object/public/entity-states/audios/ee1d4658-625f-4b2c-8e13-e068a7d7da10/ebf0a298-4882-4f59-9080-0f479e4da088.m4a usedRetries=0 (index-Dk_n8-Sf.js, line 16)
新API実装前から もともとあったバグ やられボイスがならない 問題が解消した。
playEnemyDefeatVoice の呼出箇所は AnimationDebug.tsx の2箇所だけで、バトル本体(Battle.tsx / Battle/Enemy.tsx)からは一切呼ばれていません。
Enemy.tsx で defeatEffect は spin / blastOff / explode の演出系のみ参照していて、voice の発火実装が抜けているようです(機能未実装または実装漏れ)。
→ 「実機で鳴らない」のは旧 API のバグではなく、そもそもバトル中の発火経路が存在しないのが根本原因です。新 API への置換では解決しない問題。
確認のため AnimationDebug.tsx の呼出方を見て、バトル本体に同じ trigger を入れるべき場所を特定します。
読み取り 2個のファイル
結論
旧 playOneShotVoiceByUrl は実機で鳴らないのではなく、バトル中の Enemy.tsx から発火経路自体が存在しないのが根本原因でした。
AnimationDebug.tsxではプレビュー用にenemyState === "dead"に切り替えた時にplayEnemyDefeatVoiceを呼んでいる- バトル中の
Enemy.tsxではlive.state === "dead"を「吹っ飛び演出」用にしか参照しておらず、voice 発火していない
つまり機能未実装。SE(キラーン)は別経路で発火しているから鳴っていただけで、voice は一度も鳴ったことがない状態だった可能性が高い。