【UE5】BGMを途切れさせない!プレイリスト形式の連続再生ロジック構築ガイド
ゲームの世界観を彩るBGM。せっかくマーケットプレイス(Fab)で最高のBGMアセットを手に入れたのなら、最高の形でプレイヤーに届けたいですよね。今回は、複数のBGMをプレイリストのように、途切れなく連続再生させるブループリントロジックをご紹介します。
今回実装するBGM再生システムの仕様
まずは、どのような機能を目指すのかを明確にしておきましょう。
| 項目 | 条件 |
|---|---|
| 目的 | BGMをシームレスに連続再生する。 |
| BGMファイル | 複数のSound Cueアセット(今回は10曲を想定)をプレイリストとして使用する。 |
| 再生ルール |
1. 最初の曲はプレイリストからランダムに選択。 2. 2曲目以降はプレイリストの順番通りに再生し、最後までいったら最初に戻る。 |
| 実装場所 | Level Blueprintに実装します。 |
| 再生の継続 | 曲の終了を自動で検知し、次の曲へスムーズに移行させます。 |
【注意】
この実装はレベルブループリントで行うため、レベルを移動するとBGMは停止します。ゲーム全体でBGMを継続させたい場合は、Game Instanceへの実装が推奨されます。
Step 1: 必要な変数を準備しよう
最初に、ロジックの土台となる変数を3つ作成します。BGMを再生したいレベルのLevel Blueprintを開いて、以下の変数を追加してください。
| 変数名 | 型 | 解説 |
|---|---|---|
BGMPlaylist |
Sound Cue (Object Reference) の配列 | 再生したいBGMアセットをすべて格納するプレイリスト本体です。 |
CurrentTrackIndex |
Integer | 現在再生している曲が、プレイリストの何番目かを記憶しておくための変数です。 |
PlayingBGM |
Audio Component (Object Reference) | 現在再生中のAudio Componentそのものを保持します。手動で破棄するために必須の変数です。 |
Step 2: 再生開始のきっかけを作る (Event BeginPlay)
レベルが始まった瞬間に、プレイリストからランダムで選んだ最初の1曲を再生する処理です。
Event BeginPlayノードから処理を開始します。BGMPlaylist変数をグラフにドラッグ&ドロップし、そこからGet (a copy)とLast Indexを繋いだRandom Integer in Rangeノードでランダムなインデックスを取得します。- 取得したランダムなインデックスを
CurrentTrackIndex変数にセットします。 - 後述するカスタムイベント
StartBGMを呼び出します。
これで、レベルが開始されるたびに毎回異なる曲からBGMがスタートするようになります。
Step 3: BGM再生と「曲の終わり」を予約する (Custom Event: StartBGM)
このカスタムイベントが、BGM再生ロジックの心臓部です。指定された曲を再生し、その曲が終わったタイミングで次の処理へ移るための「予約」を行います。
StartBGMという名前でカスタムイベントを作成します。- 【重要:メモリリーク対策】
まずPlayingBGM変数が有効かIs Validでチェックします。もし有効(つまり、前に再生されていた曲のAudio Componentが残っている)なら、Destroy Componentノードで明示的に破棄します。これを怠ると、見えない音源がどんどん溜まっていくので注意しましょう。 BGMPlaylist配列からCurrentTrackIndexを使って再生すべきSound Cueを取得し、Spawn Sound 2Dノードで再生します。- 【最重要ポイント】
Spawn Sound 2Dノードの詳細パネルを開き、Auto Destroyのチェックを外します。 これがONだと、再生終了時にAudio Componentが自動で破棄されてしまい、終了イベントを検知できなくなります。 Spawn Sound 2Dの戻り値(生成されたAudio Component)を、PlayingBGM変数にセットして保持します。PlayingBGM変数からAssign On Audio Finishedノードを繋ぎます。これは「再生が完了したら、指定したイベントを呼び出す」という予約処理です。イベントピンに、次のステップで作成するカスタムイベントOnAudioFinished_Eventを接続します。
Step 4: 次の曲へバトンを繋ぐ (Custom Event: OnAudioFinished_Event)
Assign On Audio Finishedによって曲の終了時に自動で呼び出されるイベントです。次の曲のインデックスを計算し、再びStartBGMを呼び出すことで、音楽をループさせます。
OnAudioFinished_Eventという名前でカスタムイベントを作成します。CurrentTrackIndex変数をIncrementIntノードで +1 します。- 次に、
Modulo(剰余)ノードを使います。IncrementIntの結果を、BGMPlaylistのLength(配列の要素数)で割った余りを計算し、これを新しいCurrentTrackIndexとしてセットします。- Modulo演算の役割: これにより、インデックスがプレイリストの最大数を超えた瞬間に0に戻るため、最後の曲が終わったら自然に最初の曲へループさせることができます。
- 最後に、カスタムイベント
StartBGMを呼び出します。これにより、更新されたCurrentTrackIndexの曲が再生され、再び再生終了が予約される…というサイクルが完成します。
💡 発展:レベルを移動してもBGMを止めない方法
今回の実装はLevel Blueprintに記述したため、他のレベルに移動するとBGMは止まってしまいます。
もし、ステージ遷移後も同じBGMを継続させたい場合は、このロジック全体をGame Instanceに実装しましょう。 Game Instanceはゲームの起動から終了まで永続するオブジェクトなので、レベルをまたいで情報を保持するのに最適です。
まとめ
お疲れ様でした!以上の手順で、シンプルながらも効果的なBGM連続再生システムが完成しました。
- Event BeginPlay で最初の曲をランダムに決定
- StartBGM イベントでBGMを再生し、終了イベントを予約
- OnAudioFinished イベントで次の曲へインデックスを進め、再び StartBGM を呼ぶ
この仕組みを応用すれば、ボスの出現でプレイリストを切り替えたり、特定のエリアに入ったら別のBGMセットを再生したりと、よりインタラクティブなサウンド演出が可能です。ぜひ、あなたのゲームに最高の音楽体験を実装してみてください!
記事検索
NEW
-
query_builder 2025/10/25
-
【UE5】レベル上のアクターを確実にリセットする方法 - サブレベルとChildアクターの落とし穴に注意!
query_builder 2025/10/15 -
5期目を迎えた株式会社PoisonGamesは今...
query_builder 2025/08/03 -
メックネストの記事を作成していただきました♪
query_builder 2025/03/04 -
株式会社PoisonGamesが本日4期目を迎えました!
query_builder 2024/08/05