Unity 5✕Androidで低レイテンシ(発音遅延しない)な音を再生するアセットを作ってみた
補足
Unity 5.2辺りから、 FEATURE_AUDIO_LOW_LATENCYが得られる端末でOpenSLがAndroid上で動作しているので、実際にコレを導入しなくとも案外良いかもしれません。
本文
Unity5向けオーディオの機能を確認しているときに、Androidデバイスの音のなり始めが遅いのが気になったので、実装を模索してみました。
Androidでのレイテンシ問題は結構根深く、デバイスの統一されたiOSと違いかなり難しいところがあります。幾つかのAndroidバージョンで低レーテンシについて最適化を行っているみたいですが、iOSと比較するとまだまだみたいです。
Androidの10ms問題:Androidオーディオパスレイテンシ解説 | インフラ・ミドルウェア | POSTD
Mikeのプログラミング・メモ: Android 4.0で反応の良い楽器アプリは可能になるのか
Mikeのプログラミング・メモ: AndroidでiPhoneに匹敵する楽器アプリの作成が困難な理由
今回作った物はAndroid Sound Latency Fix | Unity Communityを少し手直ししたもので、G-MODE Engineers' Blog — Unity☓Androidアプリの発音遅延を解消するで紹介されているようにSoundPoolを使用して音を再生しています。
またAndroid実機確認だけだと面倒なので、エディタや他のプラットフォームでも概ね同じように動作するように、調整しています。
使い方
まずはエディタ側で動作を確認している状況。
- tsubaki/Low-latency_Sound_for_UnityAndroid · GitHubからaudiose.unitypackageをダウンロードしてインポートします。
- AudioSEPluginのAudioCenterをシーンの適当なオブジェクトへアタッチします。
- 再生したい音をAssets/AudioSEPlugin/Resources/SEの中に含めます。
- 音の読込・再生は下のような感じでコードを記述します。
- gist.github.com
Android向けにビルドする場合は、ビルド前に Assets/SEAudio/set up android build を実行します。エディター・その他プラットフォームで再生するには、Assets/SEAudio/setup any platform or editor を実行します。
Assets/StreamingAssets/SEフォルダが必要です。
仕様
自分の持つ端末で低レーテンシな音はコレで実現できましたが、それなりの制限があります。
- 複数の音を同時に再生出来ない
- 音は10秒以内
- 音は.wavを想定
- 256種類以上登録できない
- load後に即再生出来ない
- 音量を変更できない
- 端末によっては逆に遅いケースもあるらしい
- Unityプロファイラのメモリに計上されない
- StreamingAssetsフォルダは必須
- AudioSEPluginのフォルダ名は変更不可*1
要するにSoundPoolの制約+αです。
たぶん波形を渡して動くAPIでは無いので、こういった制限があるのではないかと思われます(その代わりレスポンスが良い)
ソレ以前に最近のデバイス等だとコレ使わなくても結構高いレーテンシで音を出してくれたりするので、まぁ何とも。
*1:ハードコーディングしているため