探索中は静かなアンビエントが流れている。敵に見つかった瞬間、ドラムが入り、弦が重なって、戦闘の緊張感が出る。倒しきると、また静かに戻る。
こうした状況で変化するBGMは、ゲーム体験を大きく変える演出です。そしてUEはこの領域が特に強い——MetaSoundsは、もともとこういう用途のために作られた仕組みです。この記事では、BGMを「重ねられる層」として考える発想から、MetaSoundsでの組み方、Blueprintから戦闘度合いを渡す方法までを解説します。
この記事でわかること
- BGMを 1本の曲ではなく「層」 として考える
- 縦の重ね と 横の遷移 の違い(縦から始める)
- MetaSoundsで 複数のWave Playerを同時に走らせる
Set Float Parameterで 外から戦闘度合いを渡す- 実践: 敵が近づくと戦闘レイヤーがフェードインする
BGMを層として考える
普通のBGMは、1本の完成した曲です。再生すれば最初から最後まで同じものが流れます。
インタラクティブミュージックでは、これを複数の層に分けて持ちます。

| 層 | 中身 | いつ鳴らすか |
|---|---|---|
| 探索レイヤー | パッド、アルペジオ | 常に鳴っている(土台) |
| ドラムレイヤー | パーカッション | 敵を検知したら足す |
| 緊迫レイヤー | 弦、ブラス | 戦闘が激しくなったら足す |
土台の層は止めません。 上に乗る層を足したり引いたりするだけです。
こう考えると、「曲が切り替わる」のではなく 「同じ曲の厚みが変わる」 という表現になります。プレイヤーからすると、 音楽が途切れないまま、気づくと緊張感が上がっている という自然な体験になります。
縦の重ねと横の遷移
インタラクティブミュージックのやり方は、大きく2つに分かれます。

| 方式 | やること | 難易度 |
|---|---|---|
| 縦の重ね(レイヤリング) | 同じ曲の上に楽器を足し引きする | 🟢 やさしい |
| 横の遷移(トランジション) | 曲Aから曲Bへ、区切りの良い拍で切り替える | 🔴 難しい |
この記事で扱うのは縦の重ねです。 理由は3つあります。
- 位相がずれない: 全層を最初から同時に鳴らし続けるので、ぴったり揃ったままです
- 途切れない: 音量を動かすだけなので、切り替えの瞬間に無音になりません
- 効果が大きい: ドラムが1本入るだけで、体感の緊張感ははっきり変わります
横の遷移は「今の小節が終わるまで待ってから切り替える」というタイミング制御が要ります。これは仕組みとして一段複雑で、素材も遷移用の短い繋ぎ(トランジション)を別途用意することが多くなります。まず縦で作って、必要になったら横を検討するのが現実的な順序です。
素材の前提
ここを飛ばすと再現できないので、先に書きます。縦の重ねには、同じテンポ・同じ長さで書き出した複数のトラックが必要です。

作り方はこうです。
- DAWで 1曲として 作曲する(探索も戦闘も同じテンポ・同じコード進行)
- トラックを グループごとに分けて書き出す(パッド / ドラム / 弦)
- 全ファイルを同じ長さ(例: 32小節ちょうど)にする
長さが1サンプルでもずれていると、ループのたびに少しずつズレていきます。 数回ループした頃には、明らかに気持ち悪い音になります。書き出し時に長さを揃えることが、この方式の生命線です。
手持ちの素材で試すなら。 インタラクティブ用に書き出された素材がなくても、同じテンポの別々のループ素材を組み合わせれば練習にはなります。フリー素材サイトで「120 BPM / 8 bars」のように条件を揃えて探してください。ぴったり合わなくても、仕組みの理解には十分です。
MetaSoundsで層を組む
MetaSoundsの基本 で扱った Wave Player を、層の数だけ並べます。

構造はシンプルです。
| 部品 | 役割 |
|---|---|
| On Play(MetaSound Sourceに最初からある) | 再生開始の合図。ここから全 Wave Player へ配る |
| Wave Player(層の数だけ) | 各トラックを同時に再生する |
| Multiply(層ごと) | その層の音量を掛ける(0.0〜1.0) |
| Mixer | 全層を合流させる |
| Input(Float) | 外から戦闘度合いを受け取る |
最初にやることは On Play の配線です。 MetaSound Sourceには On Play という Trigger出力 があり、Wave Player 側にも Play という Trigger入力 があります 。この2つを繋がないと、Wave Player はいつまでも鳴りません。
そして、On Play から全部の Wave Player へ分岐させます。ここを1本ずつ別のタイミングで繋ぐのではなく、同じ On Play から一斉に配るのが同期の要です。

要点は、全部の Wave Player を最初から一斉に再生し、止めないことです。聞こえないようにしたい層は、Multiply に 0.0 を掛けるだけ。再生自体は続いています。
これが位相を揃える仕組みです。もし「戦闘に入ってからドラムを再生開始」にすると、曲の途中から鳴り始めるので拍が合いません。最初から鳴らしておいて、音量だけ動かす。ここが方式の核心です。
Wave Player はすべて Loop をオンにしておきます。全ファイルが同じ長さなら、何周してもズレません。
音量は掛け算で。
Multiplyに入れる値は0.0(無音)から1.0(そのまま)です。急に0と1を切り替えるとブツッと鳴るので、Blueprint側でなめらかに動かします(次の節)。
Blueprintから値を渡す
MetaSoundに Input(Float型、名前は CombatIntensity など)を作ると、外から値を送り込めます。
送るのは Set Float Parameter です。再生中のAudio Componentに対して呼びます。

| ピン | 入れるもの |
|---|---|
| Target | BGMを再生している Audio Component |
| In Name | MetaSound側の Inputの名前(CombatIntensity) |
| Float | 渡したい値(0.0 〜 1.0) |
ここで大事なのが、BGMをAudio Componentとして持っておくことです。Play Sound 2D のような撃ちっぱなしのノードだと、後から値を送る相手がいません(→ 3Dサウンドと音量管理)。
- ❌
Play Sound 2D— 戻り値がないので、後から操作できない - ⭕
Spawn Sound 2D— Audio Componentが返ってくるので、変数に保持できる
そして、値は急に変えずに補間します。0.0 から 1.0 へ一瞬で飛ぶと、ドラムが唐突に現れて不自然です。FInterp To を通すと、じわりと緊張感が高まる気持ちのいい変化になります(→ 回転と補間の基礎)。
Interp Speedは「秒数」ではありません。FInterp Toは目標との距離に応じて近づくノードなので、近づくほど遅くなり、厳密には目標にぴったり到達しません。だから「◯秒で切り替わる」とは指定できません。ここで決めているのは 切り替わりの速さの感触 です。「戦闘に入って正確に2秒で完全に切り替えたい」という要件があるなら、Timelineノード のように時間を明示できる仕組みを使ってください。
実践:敵が近づくと戦闘レイヤーが入る
ステルスゲームで見つかった瞬間、ホラーで追跡が始まる瞬間、ARPGでボス部屋に入った瞬間。「状況が変わると音楽が厚くなる」 はジャンルを問わず効きます。ここでは2層の最小構成で作ります。
用意するもの
| 項目 | 内容 |
|---|---|
| 音素材 | 同じテンポ・同じ長さのループ2本。SW_Explore(パッド)と SW_Combat(ドラム) |
| MetaSound | MS_BattleMusic |
| 敵 | AI Perception の BP_Guard (検知でイベントが飛ぶ状態) |
| BGMを持つ場所 | プレイヤーのBlueprint(または GameState) |
変数は2つです。
| 変数名 | 型 | 既定値 | 用途 |
|---|---|---|---|
MusicComponent | Audio Component | (なし) | 再生中のBGMを保持する |
TargetIntensity | Float | 0.0 | 目標の戦闘度合い |

① MetaSoundを作る
MS_BattleMusicを新規作成するWave Playerを2つ置き、それぞれSW_ExploreとSW_Combatを指定。両方ともLoopをオンOn Playから、2つのWave PlayerのPlay入力へ分岐させて繋ぐ(ここを忘れると無音のまま何も起きません)Inputを1つ作る。型は Float、名前はCombatIntensity、既定値0.0SW_Combat側のWave Playerの出力をMultiplyに通し、もう一方の入力にCombatIntensityを繋ぐSW_Exploreの出力と、手順5の出力をMixerで合流させ、Outputへ繋ぐ
これで、CombatIntensity が 0.0 なら探索レイヤーだけ、1.0 なら両方が鳴ります。MetaSoundエディタの上部で試聴(Play)して、まず探索レイヤーが鳴ることを確認してから先へ進んでください。
② Blueprintで再生して、値を送る

BP_Player(イベントグラフ)
Event BeginPlay
→ comp = SpawnSound2D(Sound = MS_BattleMusic)
→ Set MusicComponent = comp
Event Tick(Delta Seconds)
→ current = MusicComponent の現在値を保持した変数(CurrentIntensity)
→ newValue = FInterpTo(
Current = CurrentIntensity,
Target = TargetIntensity,
DeltaTime = Delta Seconds,
InterpSpeed = 0.5) // 秒数ではなく「近づく速さ」
→ Set CurrentIntensity = newValue
→ MusicComponent.SetFloatParameter(
InName = "CombatIntensity",
Float = newValue)
// 敵から呼ばれるイベント
OnDetected → Set TargetIntensity = 1.0
OnLostSight → Set TargetIntensity = 0.0
BP_Guard の On Target Perception Updated から、検知したら OnDetected を、見失ったら OnLostSight を呼びます。
確かめる
Playすると、まず静かなパッドだけが流れます。見張りの視界に入ると、1〜2秒ほどかけてドラムがじわりと重なってきます。曲は途切れず、テンポも拍もそのままです。
見張りから離れて視界を外れると、今度は同じ速さでドラムが引いていきます。パッドは最初から最後まで一度も途切れていません。
InterpSpeed を 0.5 から 3.0 に上げてみてください。切り替わりが素早くなり、緊迫感が増します。逆に 0.2 まで下げると、じわじわとしか変化せず、緊張感が伝わりにくくなります。この1つの数字が演出の性格を決めます。
うまくいかないときの切り分けです。
- まったく音が鳴らない →
On PlayからWave PlayerのPlayへ繋いでいません。いちばん多い原因です。MetaSoundエディタで試聴して切り分けてください - ドラムが最初から鳴っている →
Inputの既定値が0.0になっていないか、Multiplyの接続先が逆です - 数回ループするとズレる → 2つの音源の長さが揃っていません。DAWで書き出し直してください
- 値を送っても変わらない →
Play Sound 2Dで再生していて Audio Component を持っていないか、In Nameの綴りが MetaSound側のInput名と違います - 切り替わりがブツッと鳴る → 補間せずに
0と1を直接送っています
ポイントは2つです。
- 全レイヤーを止めない: 聞こえない層も再生し続けます。これが位相を揃える唯一の方法で、「必要になってから再生開始」にすると拍が合いません
- 値は必ず補間する:
0と1の切り替えではなく、FInterp Toを通します。この「間」が「音楽が反応している」という感覚を作ります 。Interp Speedは秒数ではなく速さの感触なので、耳で聞きながら決めてください
最終的な音量バランス(BGMと効果音の比率、設定画面の音量スライダー)は、Submixと音量管理 の担当です。
おまけ:先に知っておくと良いこと
層は3〜4までに収める。 音量ゼロの層も再生処理は走っています。10層並べれば10本ぶんのコストがかかるので、実用上は探索・ドラム・緊迫の3層もあれば十分な表現ができます。
Sound Cueでも簡易版は作れる。 MetaSoundsが登場する前は、Sound Cue の Crossfade by Param などで同じことをしていました。今から作るなら MetaSounds が素直ですが、既存プロジェクトが Sound Cue で組まれているなら、無理に移行する必要はありません(→ Sound CueとSound Wave)。
横の遷移をやりたくなったら。 「ボス戦だけまったく別の曲」のように曲そのものを変えたい場合は、横の遷移が要ります。MetaSoundsには拍に合わせて処理を発火させる仕組みがあるので、 「次の小節の頭まで待ってから切り替える」 という形で組みます。ただし素材側にも繋ぎのフレーズが必要になることが多く、作曲側の負担が上がります。
段階を0と1に限らない。 CombatIntensity は連続値なので、敵との距離に応じて 0.3 や 0.7 を送ることもできます。「近づくほど音楽が厚くなる」という表現が、変数1つで作れます。ステルスゲームの緊張度メーターと連動させると効果的です。
まとめ
- BGMを 1本の曲ではなく「層」 として持つ
- まずは 縦の重ね(レイヤリング) から。横の遷移は難易度が跳ね上がる
- 素材は 同じテンポ・同じ長さ で書き出す。ここがずれると全部崩れる
- MetaSoundsでは 全層を同時再生したまま、
Multiplyで音量だけ動かす - MetaSound側では
On Playから全Wave PlayerのPlayへ配線する (忘れると無音) - Blueprintからは
Spawn Sound 2Dで保持 →Set Float Parameter。値は 補間して送る(Interp Speedは秒数ではない)
仕組みとしては「音量を掛けるだけ」ですが、体験は驚くほど変わります。あなたのゲームでは、何が起きたときに音楽を厚くしたいでしょうか。