Unreal Engine 4のオーディオ機能で、「え?そんな簡単な事もできないの?」ってのが一つあって、それがイントロ付きBGMの実装です。
で、結論から言うとUE4単体での実装では難しいです。今回紹介するのも決して万能な方法ではないので、ゲームによっては解決しない事もあるので過度の期待は厳禁です。
今回の方法で解決出来る場合もあれば、やはりできない場合もあるという事は肝に銘じておいてください。また、やり方はいくつかあるのですがこれはその一例です。
これからUE4を勉強しよう、自分の職種のパートはわかるけど他はわからないという人は下記の書籍を超絶オススメしています。日本語で順を追ってUE4を学びたければ、この本を置いて他にはないと個人的には思います。まずは、この本の通りに実際にレベルを作ってみる事をオススメします。
ボーンデジタル
売り上げランキング: 10,253
オーディオファイルのループタグは無視される
この手のものは、オーディオファイル自体にループタグを埋め込んでおけば、波形をゲームツールに読み込んで、ループのチェックボックスをONにするだけで上手くいって欲しいのですが、UE4はループタグを無視して、オーディオ波形全体をループしちゃいます。
ゲーム・サウンド制作の標準ツールとも言って良い「Sony Sound Forge Pro」。たまに期間限定で激安セールをやるので要チェックやで!フリーの波形編集ツールでも出来ると思いますが、DAWはわりと精度が甘かったり、余計な処理が入る場合もあるので、このレベルの細かい作業には不向きです。DAWで作っても最終的に波形編集ソフトを使うのが一般的です。
それはさておき、Sound Forgeでループ区間を選択し、メニューから[挿入]>[サンプルループ]で「サスティンループ」が追加されます。イントロ付きのループBGMがサウンドデザイナーから渡された場合、こういった処理がされているのが通例となっています。
イントロとループ区間のファイルに分割して読み込む
UE4がループタグに対応してくれればよいのですが、今回は回避方法としてオーディオ波形をイントロ部分と、ループ区間部分に分けて再生する方法を取ります。
上記の例ではループ区間用のファイル(UE4Loop_Test_loop.wav)に「サスティンループ」が入ったままになっていますが、消しても消さなくてもどちらでもよいです。結局UE4では無視されちゃいますからね……。
Sound Cueを作成する
2つに分割したオーディオファイルを読み込みます。そして[Sound Cue]を一つ作ります。
Intro波形の尺を秒数でコピー
Sound Forgeのタイム表記を「秒」に変更して、Intro波形の尺の値をコピーします。
Intro尺の小数点以下3桁がに抑えた方がいいような気もするけど、ひとまずコレで。
ちなみに、Sound Forgeを使わなくてもサウンドウェーブにマウスを重ねるか、ダブルクリックでも長さの確認はできる。
Sound CueのDelayの値にペースト
[Sound Cue]は以下のようになっています。
分割して読み込んだ[サウンドウェーブ]が2つ。Loop部分のウェーブ直後に[Delay]ノードを挿入し、Introの再生が終わったタイミングで再生開始するよう時間調整します。最終的にその2つの波形をMIXしてるだけの簡単な[Sound Cue]です。
Loop部分のウェーブの直後にある[Delay]の、MinとMax両方にSound Forgeからコピーした値をペーストします。
ループ部分の[Wave Player]の詳細にある[Looping]チェックボックスをONにします。Intro部分のはONしなくてよいです。
Mixの後のDelay
さて、既に気づいてる人もいると思いますが、Mixの後ろにある[Delay]ノードが気になりますよね……。ここにDelayを入れずに再生すると、[Sound Cue]単体でプレビューした時にはうまくBGMが繋がって聞こえます。
ですが、実際のビルドでこの[Sound Cue]をトリガーすると、やはりつなぎ目のタイミングが上手く合わない事に気付くと思います。
ここの[Delay]は、Intro部分と、Loop部分が「よーいドン!」でスタート出来るためのバッファみたいなもんです。なのでシンプルなゲームの場合、ここのDelay値は0.1とかそれ以下でもOKです。ただ、ゲームが重くなればなるほどここの数字を大きくする必要があります。ビルドで確認して上手くBGMがつながっているか確認する必要があります。ビルドしてみて実機での動作を確認してみないと……という面倒くささもあります。
Map開始直後というのは、様々なアセットをロードしたり描画したりで負荷がかかりやすいので[Delay]で、少し再生の時間をズラしてあげている言っても良いです。
対処療法というべきか、結果的に上手くIntro部分とLoop部分が繋がる場合があります。
なので、これでは上手く解決しない場合もあるでしょう。また、BGMの再生開始のタイミングが遅れる事にもなります。Delay値0.1程度では聴感上気にならなくても、1秒くらいになると気になるかもしれません。
また、例えば「このステージでは大丈夫だけど、このステージでは上手くいかない」といった特定条件で上手くいかないという事も出てくると思います。万能な解決方法ではありません。
ダメな例
[Concatenator]ノードで並べてしまう
ダメな例も一応紹介。[Concatenator]でやっても上手く繋がってくれません。BGMのシームレスな再生には[Concatenator]ノードは向いてません。
[Loop]ノードでループさせる
音楽のループに[Loop]ノードを使うのは基本推薦されていません。
BGMのような完璧なループ再生を求める場合は、[Wave Player]の[Looping]チェックボックスを使いましょう。
意外と難しいシームレスなBackground Music再生
シームレスな音楽の連続再生というのは、原理的に48kHzの音声ファイルなら、1秒間に48000フレームでタイムラインを走らせ、その間全く処理落ちもせず次の音にバトンタッチしなければノイズが発生してしまいます。サンプリングレートでのタイミング精度が求められるので、Sound CueやBlueprintで制御できる精度では、ちと荷が重いです。サウンドデザイナーが求めるような精度と確実性はありません。
なので、ゲームによってはイントロ用ファイルのおしりに数秒余韻をつけ、ループ部分の頭にも少しイントロに被る立ち上がりの部分を用意し、Blueprintの[Fade In][Fade Out]を使って擬似的にクロスフェードさせて、ごまかすという手段もあります。
ラーニングにある、ShooterGame(シューターゲーム)なんかは、この方法に近い形でIntro付きBGMの実装を行っています。
しかしこの方法はサウンドデザイナーの制作の負担も多く、曲作りそのもに制限を課す場合もあります。曲調によっては上手くいかない、もしくはその手法を取れない場合も往々にしてあります。ちゃんとやりたければ、ローレベルの対応か、WwiseやFMODやADX2を使うのが確実って話になってしまいます。