【Unity】BGMの途中からループは、できる! もっと簡単に!
貴方は、「UnityではBGMの途中からループができない」と思っている、または思っていませんでしたか? そして、そのためだけに、貴方はADX2とかの導入を検討しませんでしたか?
私はしました。
私はその後一度、「BGMデータを2ループ分作り、timeSamplesを巻き戻す」という方法があることに気づきました。他にも、世の中にはAudioSource.PlayScheduledを次々に実行するという実装をした方もいらっしゃるようです。
ですが、今なら言えます。
そんなことをする意味は、最初から無かったのです!
BGMをちゃんと途中からループさせたい。それだけであれば、ミドルウェアはもちろんのこと、コードの1行すら書く必要がありません。
(追記:ただしWebGLを除きます)
私の作ったこちらのエディタ拡張をご利用ください。
そして、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時代はそれでいけたはずですが……。