【Unreal Engine】戦闘に入ると曲が変わる:MetaSoundsで作るインタラクティブミュージック

作成: 2026-07-25

BGMを1本の曲ではなく重ねられる層として考えます。縦の重ね(レイヤリング)と横の遷移(トランジション)の違い、MetaSoundsで複数のWave Playerを同時に走らせて音量だけ出し入れする作り方、Set Float Parameterで外から渡す方法を図解。敵が近づくと戦闘レイヤーがフェードインする実践つき。

探索中は静かなアンビエントが流れている。敵に見つかった瞬間、ドラムが入り、弦が重なって、戦闘の緊張感が出る。倒しきると、また静かに戻る。

こうした状況で変化するBGMは、ゲーム体験を大きく変える演出です。そしてUEはこの領域が特に強い——MetaSoundsは、もともとこういう用途のために作られた仕組みです。この記事では、BGMを「重ねられる層」として考える発想から、MetaSoundsでの組み方、Blueprintから戦闘度合いを渡す方法までを解説します。

探索レイヤーの上に戦闘レイヤーが重なっていく様子とソフトブルーのクレイ人形

この記事でわかること

  • BGMを 1本の曲ではなく「層」 として考える
  • 縦の重ね横の遷移 の違い(縦から始める)
  • MetaSoundsで 複数のWave Playerを同時に走らせる
  • Set Float Parameter外から戦闘度合いを渡す
  • 実践: 敵が近づくと戦闘レイヤーがフェードインする

Sponsored

BGMを層として考える

普通のBGMは、1本の完成した曲です。再生すれば最初から最後まで同じものが流れます。

インタラクティブミュージックでは、これを複数の層に分けて持ちます

探索・ドラム・緊迫の3層が縦に重なり、状況に応じて上の層が足し引きされることを示した図
中身いつ鳴らすか
探索レイヤーパッド、アルペジオ常に鳴っている(土台)
ドラムレイヤーパーカッション敵を検知したら足す
緊迫レイヤー弦、ブラス戦闘が激しくなったら足す

土台の層は止めません。 上に乗る層を足したり引いたりするだけです。

こう考えると、「曲が切り替わる」のではなく 「同じ曲の厚みが変わる」 という表現になります。プレイヤーからすると、 音楽が途切れないまま、気づくと緊張感が上がっている という自然な体験になります。


縦の重ねと横の遷移

インタラクティブミュージックのやり方は、大きく2つに分かれます。

縦の重ねは同じ曲に層を足し引きし、横の遷移は区切りの良い拍で別の曲へ切り替えることを対比した図
方式やること難易度
縦の重ね(レイヤリング)同じ曲の上に楽器を足し引きする🟢 やさしい
横の遷移(トランジション)曲Aから曲Bへ、区切りの良い拍で切り替える🔴 難しい

この記事で扱うのは縦の重ねです。 理由は3つあります。

  • 位相がずれない: 全層を最初から同時に鳴らし続けるので、ぴったり揃ったままです
  • 途切れない: 音量を動かすだけなので、切り替えの瞬間に無音になりません
  • 効果が大きい: ドラムが1本入るだけで、体感の緊張感ははっきり変わります

横の遷移は「今の小節が終わるまで待ってから切り替える」というタイミング制御が要ります。これは仕組みとして一段複雑で、素材も遷移用の短い繋ぎ(トランジション)を別途用意することが多くなります。まず縦で作って、必要になったら横を検討するのが現実的な順序です。


素材の前提

ここを飛ばすと再現できないので、先に書きます。縦の重ねには、同じテンポ・同じ長さで書き出した複数のトラックが必要です。

DAWで1曲を作り、トラックごとに同じ長さで書き出すことで、重ねてもズレない素材になることを示した図

作り方はこうです。

  1. DAWで 1曲として 作曲する(探索も戦闘も同じテンポ・同じコード進行)
  2. トラックを グループごとに分けて書き出す(パッド / ドラム / 弦)
  3. 全ファイルを同じ長さ(例: 32小節ちょうど)にする

長さが1サンプルでもずれていると、ループのたびに少しずつズレていきます。 数回ループした頃には、明らかに気持ち悪い音になります。書き出し時に長さを揃えることが、この方式の生命線です。

手持ちの素材で試すなら。 インタラクティブ用に書き出された素材がなくても、同じテンポの別々のループ素材を組み合わせれば練習にはなります。フリー素材サイトで「120 BPM / 8 bars」のように条件を揃えて探してください。ぴったり合わなくても、仕組みの理解には十分です。

Sponsored

MetaSoundsで層を組む

MetaSoundsの基本 で扱った Wave Player を、層の数だけ並べます

上段でOn Playから2つのWave Playerへ分岐して一斉に鳴らし、下段でSW_Combatの出力にMultiplyで音量を掛けてMixerへ合流させる2段組みの構造図

構造はシンプルです。

部品役割
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 から一斉に配るのが同期の要です。

MetaSound SourceのOn Play Triggerから2つのWave PlayerのPlay入力へ同時に分岐し、同じ瞬間に再生が始まることを示した図

要点は、全部の Wave Player を最初から一斉に再生し、止めないことです。聞こえないようにしたい層は、Multiply0.0 を掛けるだけ。再生自体は続いています。

これが位相を揃える仕組みです。もし「戦闘に入ってからドラムを再生開始」にすると、曲の途中から鳴り始めるので拍が合いません。最初から鳴らしておいて、音量だけ動かす。ここが方式の核心です。

Wave Player はすべて Loop をオンにしておきます。全ファイルが同じ長さなら、何周してもズレません。

音量は掛け算で。 Multiply に入れる値は 0.0(無音)から 1.0(そのまま)です。急に 01 を切り替えるとブツッと鳴るので、Blueprint側でなめらかに動かします(次の節)。


Blueprintから値を渡す

MetaSoundに Input(Float型、名前は CombatIntensity など)を作ると、外から値を送り込めます

送るのは Set Float Parameter です。再生中のAudio Componentに対して呼びます。

BlueprintのSet Float ParameterがMetaSoundのInputへ値を渡し、その値がMultiplyの音量になる流れ図
ピン入れるもの
TargetBGMを再生している Audio Component
In NameMetaSound側の Inputの名前CombatIntensity
Float渡したい値(0.01.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ノード のように時間を明示できる仕組みを使ってください。

Sponsored

実践:敵が近づくと戦闘レイヤーが入る

ステルスゲームで見つかった瞬間、ホラーで追跡が始まる瞬間、ARPGでボス部屋に入った瞬間。「状況が変わると音楽が厚くなる」 はジャンルを問わず効きます。ここでは2層の最小構成で作ります。

用意するもの

項目内容
音素材同じテンポ・同じ長さのループ2本。SW_Explore(パッド)と SW_Combat(ドラム)
MetaSoundMS_BattleMusic
AI PerceptionBP_Guard (検知でイベントが飛ぶ状態)
BGMを持つ場所プレイヤーのBlueprint(または GameState)

変数は2つです。

変数名既定値用途
MusicComponentAudio Component(なし)再生中のBGMを保持する
TargetIntensityFloat0.0目標の戦闘度合い
探索中は静かな1層だけ、敵に検知されると2秒かけて戦闘レイヤーが重なり、離れると戻る流れを示した実例図

① MetaSoundを作る

  1. MS_BattleMusic を新規作成する
  2. Wave Player を2つ置き、それぞれ SW_ExploreSW_Combat を指定。両方とも Loop をオン
  3. On Play から、2つの Wave PlayerPlay 入力へ分岐させて繋ぐ(ここを忘れると無音のまま何も起きません)
  4. Input を1つ作る。型は Float、名前は CombatIntensity、既定値 0.0
  5. SW_Combat 側の Wave Player の出力を Multiply に通し、もう一方の入力に CombatIntensity を繋ぐ
  6. SW_Explore の出力と、手順5の出力を Mixer で合流させ、Output へ繋ぐ

これで、CombatIntensity0.0 なら探索レイヤーだけ、1.0 なら両方が鳴ります。MetaSoundエディタの上部で試聴(Play)して、まず探索レイヤーが鳴ることを確認してから先へ進んでください。

② Blueprintで再生して、値を送る

上段「再生して保持する」でEvent BeginPlay→Spawn Sound 2D→Set MusicComponent、下段「なめらかに送る」でEvent Tick→FInterp To→Set Float Parameterへ折り返す2段組みの完成ノードグラフ
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_GuardOn Target Perception Updated から、検知したら OnDetected を、見失ったら OnLostSight を呼びます。

確かめる

Playすると、まず静かなパッドだけが流れます。見張りの視界に入ると、1〜2秒ほどかけてドラムがじわりと重なってきます。曲は途切れず、テンポも拍もそのままです。

見張りから離れて視界を外れると、今度は同じ速さでドラムが引いていきます。パッドは最初から最後まで一度も途切れていません。

InterpSpeed0.5 から 3.0 に上げてみてください。切り替わりが素早くなり、緊迫感が増します。逆に 0.2 まで下げると、じわじわとしか変化せず、緊張感が伝わりにくくなります。この1つの数字が演出の性格を決めます。

うまくいかないときの切り分けです。

  • まったく音が鳴らないOn Play から Wave PlayerPlay へ繋いでいません。いちばん多い原因です。MetaSoundエディタで試聴して切り分けてください
  • ドラムが最初から鳴っているInput の既定値が 0.0 になっていないか、Multiply の接続先が逆です
  • 数回ループするとズレる → 2つの音源の長さが揃っていません。DAWで書き出し直してください
  • 値を送っても変わらないPlay Sound 2D で再生していて Audio Component を持っていないか、In Name の綴りが MetaSound側の Input 名と違います
  • 切り替わりがブツッと鳴る → 補間せずに 01 を直接送っています

ポイントは2つです。

  • 全レイヤーを止めない: 聞こえない層も再生し続けます。これが位相を揃える唯一の方法で、「必要になってから再生開始」にすると拍が合いません
  • 値は必ず補間する: 01 の切り替えではなく、FInterp To を通します。この「間」が「音楽が反応している」という感覚を作りますInterp Speed は秒数ではなく速さの感触なので、耳で聞きながら決めてください

最終的な音量バランス(BGMと効果音の比率、設定画面の音量スライダー)は、Submixと音量管理 の担当です。


おまけ:先に知っておくと良いこと

層は3〜4までに収める。 音量ゼロの層も再生処理は走っています。10層並べれば10本ぶんのコストがかかるので、実用上は探索・ドラム・緊迫の3層もあれば十分な表現ができます。

Sound Cueでも簡易版は作れる。 MetaSoundsが登場する前は、Sound CueCrossfade by Param などで同じことをしていました。今から作るなら MetaSounds が素直ですが、既存プロジェクトが Sound Cue で組まれているなら、無理に移行する必要はありません(→ Sound CueとSound Wave)。

横の遷移をやりたくなったら。 「ボス戦だけまったく別の曲」のように曲そのものを変えたい場合は、横の遷移が要ります。MetaSoundsには拍に合わせて処理を発火させる仕組みがあるので、 「次の小節の頭まで待ってから切り替える」 という形で組みます。ただし素材側にも繋ぎのフレーズが必要になることが多く、作曲側の負担が上がります。

段階を0と1に限らない。 CombatIntensity は連続値なので、敵との距離に応じて 0.30.7 を送ることもできます。「近づくほど音楽が厚くなる」という表現が、変数1つで作れます。ステルスゲームの緊張度メーターと連動させると効果的です。


まとめ

  • BGMを 1本の曲ではなく「層」 として持つ
  • まずは 縦の重ね(レイヤリング) から。横の遷移は難易度が跳ね上がる
  • 素材は 同じテンポ・同じ長さ で書き出す。ここがずれると全部崩れる
  • MetaSoundsでは 全層を同時再生したまま、Multiply で音量だけ動かす
  • MetaSound側では On Play から全 Wave PlayerPlay へ配線する (忘れると無音)
  • Blueprintからは Spawn Sound 2D で保持 → Set Float Parameter 。値は 補間して送るInterp Speed は秒数ではない)

仕組みとしては「音量を掛けるだけ」ですが、体験は驚くほど変わります。あなたのゲームでは、何が起きたときに音楽を厚くしたいでしょうか。