Unityで創作譜面スマホ音ゲーを作る開発日記 3【音楽再生の実装について】

今回は少しマニアックな記事です。

音楽再生の実装に悩む

効果音はADX LEを使って再生しているので低遅延で再生できているのですが、音楽の再生にはAudioSourceを使っていました。

ADX LEで音を再生するには、開発側で事前に音声ファイルに下処理をしなければなりません。このゲームにおいて音楽はユーザーが選ぶので、スマホ上で選択されて初めて音楽が決まります。この音楽に下処理をかける方法がこの当時はわかりませんでした。
ビルド時に音楽が存在しないのは悩みの種です。事前に収録されている音楽が決まっている普通の音ゲーなら、それを下処理しておけばいい話なので。

そのため、音楽にはAudioSourceを使うことになりましたが、音ゲーにおいてAudioSourceを使うのは音ズレの大きな要因になります。

AudioSourceの問題点

・再生開始時の遅延が大きい
AudioSourceは遅延が大きいため、そのまま再生すると譜面とタイミングがズレます。"n秒後に再生"のようにスケジュールを設定することである程度遅延は回避できますが、再生・一時停止の頻度が高い譜面作成時において、これは快適性を損ねてしまいます。かといってnの値を減らすと今度は音ズレの確率が上がります。

・再生中の時間が実質使えない
音ゲーでは音楽と完全に同期した時間を毎フレーム取得する必要があります。そこでAudioSourceから音楽の時間を取得してみたところ、毎フレーム時間が更新されているなら譜面はスムーズに流れるのですが、時間が更新されていないフレームが多く、かなりカクカクしてしまいました。体感として60fps出ていません。これでは快適な音ゲーとは言えません。
回避策として、代わりにゲームの経過時間を使う方法がありますが、これは音楽と同期した時間ではないため、再生中に音ズレが増えていきます。

結構致命的な問題ですね。判定ゆるゆるの雑な音ゲーなら使えそうですが、快適な音ゲーを作りたいので別の案を考える必要があります。

Timelineへの移行

UnityにはTimelineという時間軸に沿って同期する処理を行える機能があります。音楽の再生をTimelineに任せ、Timelineから時間を取得すればいいのではと思い、こちらを使ってみることにしました。
その結果、なんとか実装に成功し、Timelineの更新方法をDSPクロックに設定することで音楽と同期した時間を取得することができました。

Timelineの問題点

AudioSourceよりはマシなものの、こちらでも問題は残っています。

・依然として遅延や音ズレが存在する
AudioSourceと同様Unity純正の機能であり、低遅延を意識したものではありません。音楽の手前から再生した場合と音楽の途中から再生した場合、後者では若干の音ズレが発生します。

・少々エキセントリックな実装になった
TimelineはUnityエディタ上で作成することを前提としており、実行時にコードから音楽を割り当てたりすることをあまり想定していません。コードからTimelineそのものに変更を加えるとエディタ上で変更が行われたことになってしまうこともあり、解決するためにはクローンを行ったりと少々エキセントリックな実装が必要でした。楽曲が決まっている普通の音ゲーならこんな実装をする必要はなさそうです。

結局どうなった?

この時点ではTimelineを使っていますが、後にADX LEを使う方法が見つかりました。日記という体をとっているのでその方法は後日更新となります。しばらくお待ち下さい。

次回は縦画面と横画面のゲーム性について考察し、どちらがよいか選定します。


この記事が気に入ったらサポートをしてみませんか?