はじめに
誰もが一度は悩むUnityでのイントロ付きループBGM再生。
ADX2を使える環境ならまぁ使いますよねというところですが、諸事情で自力で頑張らないといけないこともあります。
スクリプトで解決するのもアリですが一時停止対応とか音源の分割とかそれなりに大変です。
色々調べて先人の足跡から得た解法をまとめました
こんな人が対象
Unityで音を鳴らしたことがあり、波形編集のツールを見て理解はできないが操作はできそう…
この辺がラインです
用意するもの
Unity 2019.4 : テスト環境のバージョンですが多少古くても、当然新しくても問題なさそう
適当な.wav : ループさせたい音源
Wavosaur 1.8 : ループポイントを設定するために使います
いざループポイントを追加
Wavosaur は作者様のサイトや検索でかかるところから自己責任でDLをお願いします。
日本語化パッチも検索で出てきますのでお好みでお願いします。
用意ができたらWavosaurを起動
・ファイルブラウザか、メニューバーのファイルから対象の音源を開き、画像右下のような波形のウィンドウが出ることを確認
・メニューバー>ツール>ループ>ループポイントを作成 を選択
・ループの始点終点のサンプル数がわかっている場合は メニューバー>ツール>ループ>プロパティ を選択し、ダイアログからそれぞれ設定
・サンプル数がわかっていない場合は、右下の波形ウィンドウ内の Loop start と Loop end を動かして設定
ループポイントの設定が終わればファイルを保存し音源の用意は終了です
鳴らしてみる
AudioSource audiosource;
public void Play( AudioClip clip )
{
audiosource.clip = clip;
audiosource.loop = true;
audiosource.Play();
}
疑似コードですがこんな感じでスクリプトからイントロ付きBGM再生ができちゃいます。
長さ不定になりますが、再生中にloopをfalseにすることでアウトロもできなくもないと思います。
もちろん、Unityエディタから音源のインスペクタにある再生機能でもしっかりループ再生ができていることが確認できます。
どういう仕組みか
WaveFile へsmplチャンクを追加しそこにループ情報を書き込むことでUnityがいい感じに対処してくれているようです。
今回は Wavosaur でループポイントを埋め込みましたが、smplチャンクを編集できるツールであればそちらでももちろん可能ですし、自分でWaveFileを編集するもよしです。
WaveFileだけでなくVorbisもループに対応しているようなので元音源をVorbisで作るのも、Unity側のCompressionFormatをVorbisにするのもOKでした。
最後に
多くの先人の皆様の知見をまとめただけのものです
皆様に感謝を