【Unity】BGMの途中からループは、できる! もっと簡単に!

貴方は、「UnityではBGMの途中からループができない」と思っている、または思っていませんでしたか? そして、そのためだけに、貴方はADX2とかの導入を検討しませんでしたか?
私はしました。

私はその後一度、「BGMデータを2ループ分作り、timeSamplesを巻き戻す」という方法があることに気づきました。他にも、世の中にはAudioSource.PlayScheduledを次々に実行するという実装をした方もいらっしゃるようです。

ですが、今なら言えます。
そんなことをする意味は、最初から無かったのです!

BGMをちゃんと途中からループさせたい。それだけであれば、ミドルウェアはもちろんのこと、コードの1行すら書く必要がありません。

(追記:ただしWebGLを除きます)

github.com

私の作ったこちらのエディタ拡張をご利用ください。
そして、wavファイルの上で右クリックし、ウィンドウを開いて、ただサンプル数値を入力しーー保存してください!

解説

wavファイルには、拡張フォーマットとして、smplチャンクという一種のメタデータ形式が定められています。
Unityはこのフォーマットに対応しており、インポート時に読み込んで、ループポイントつきのAudioClipにしてくれるのです。
私の知る限り全てのプラットフォームにおいて機能します。

ですが、このsmplチャンクを扱える音声編集ソフトは意外と少ないように思います。
SoundForgeやWavosaurあたりでしょうか。
ループのためだけにそうしたツールを立ち上げるくらいなら、UnityEditor上で動作するこのツールの出番というわけです。

したがって、このツールはwavにのみ対応しています。
他の音声フォーマットでも、UnityがループポイントつきAudioClipをインポートしてくれるよという情報をご存知の方は、ぜひ教えてください。

ちなみに、wavファイルバイナリを直接取り扱うパフォーマンスの関係上、Unity2018以上にしかない機能が使われています。
が、これが編集するのはImportSettingなどではなく、wavファイルそのものです。移し替えれば、たとえUnity4や5であっても動作するでしょう。(追記参照)

追記(2019/10/19)

これと同じ目的のツールを、ずっと前にchiepommeさんが制作なさっていました! qiita.com Unity2017以前の場合はこちらを使うとよさそうです。
一方、Unity2018以降の場合は、きっと私のものを利用した方が処理が速いと思います。(BitConverterは利用せず、UnsafeUtilityでバイナリを直接読み書きする実装になっています)

余談

上でAudioSource.PlayScheduledに言及しましたが、これはうまく利用すれば、フレーム単位から脱却した音声制御が可能という代物であり、単純な「途中からループ」ではない特殊な制御をしたいときにとても便利です。
頑張れば、ADX2とかに匹敵する精度でインタラクティブミュージックを行うことさえ可能です。

ーーADX2を使う意味はないのかって? それは全くの逆です。
むしろADX2という高級ツールを「ただの音声をループさせる道具」という理解にとどめるのはあまりにも失礼という、そういう話です。
再生負荷にもレイテンシにも優れていること、分業がしやすいこと、アセットバンドル独特の問題に悩まされないこと、波形が暗号化できるなどメリットづくしです。インタラクティブミュージックにしても、GUIツールが利用できるというのはあまりにも便利ですね。

追記その2(2019/10/19)

プラットフォームがWebGLの場合は、この方法は使えません。
そもそもWebGLの場合は、AudioSource.PlayScheduledすら使えません。Unityでは根本的にdspTime単位での音声制御が利用できないということなのでしょう。
timeSamplesを巻き戻す方式は使えるんでしょうか……? かつてのWebPlayer時代はそれでいけたはずですが……。