テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

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に匹敵する楽器アプリの作成が困難な理由

f:id:tsubaki_t1:20150519011502p:plain

今回作った物はAndroid Sound Latency Fix | Unity Communityを少し手直ししたもので、G-MODE Engineers' Blog — Unity☓Androidアプリの発音遅延を解消するで紹介されているようにSoundPoolを使用して音を再生しています。

またAndroid実機確認だけだと面倒なので、エディタや他のプラットフォームでも概ね同じように動作するように、調整しています。

使い方

まずはエディタ側で動作を確認している状況。

  1. tsubaki/Low-latency_Sound_for_UnityAndroid · GitHubからaudiose.unitypackageをダウンロードしてインポートします。
  2. AudioSEPluginのAudioCenterをシーンの適当なオブジェクトへアタッチします。

    f:id:tsubaki_t1:20150519011237p:plain

  3. 再生したい音をAssets/AudioSEPlugin/Resources/SEの中に含めます。

    f:id:tsubaki_t1:20150519011206p:plain

  4. 音の読込・再生は下のような感じでコードを記述します。
  5. gist.github.com

 

Android向けにビルドする場合は、ビルド前に Assets/SEAudio/set up android build を実行します。エディター・その他プラットフォームで再生するには、Assets/SEAudio/setup any platform or editor を実行します。
Assets/StreamingAssets/SEフォルダが必要です。

f:id:tsubaki_t1:20150519011140p:plain

仕様

自分の持つ端末で低レーテンシな音はコレで実現できましたが、それなりの制限があります。

  • 複数の音を同時に再生出来ない
  • 音は10秒以内
  • 音は.wavを想定
  • 256種類以上登録できない
  • load後に即再生出来ない
  • 音量を変更できない
  • 端末によっては逆に遅いケースもあるらしい
  • Unityプロファイラのメモリに計上されない
  • StreamingAssetsフォルダは必須
  • AudioSEPluginのフォルダ名は変更不可*1

要するにSoundPoolの制約+αです。

たぶん波形を渡して動くAPIでは無いので、こういった制限があるのではないかと思われます(その代わりレスポンスが良い)

ソレ以前に最近のデバイス等だとコレ使わなくても結構高いレーテンシで音を出してくれたりするので、まぁ何とも。

*1:ハードコーディングしているため