Unity でイントロ付きループ音楽を再生するコードを書いたので、共有する。

概要

  • Unity のデフォルトではイントロ付きループを再生する機能がない
  • イントロ付きループを再生するライブラリ dddnuts / DDDMusic を書いた
  • AudioSource をアタッチしているオブジェクトに DDDMusic コンポーネントを追加して、セクションを定義するだけでイントロ付きループが可能になる
  • 元ネタは geekdrums / MusicEngine

環境

  • Unity 5.3.1

使い方

dddmusic usage

1. AudioSource をシーンに配置する

配置する。(いつもどおり)

2. 配置したオブジェクトに Music コンポーネントを追加する

3. セクションを定義する

Section Definitions の Size にセクション数を入力すると、各セクションを定義できるようになる。

プロパティ名 説明
Name セクション名
Bpm BPM(テンポ)
Bars In Section セクションが何小節の長さか
Beats In Bar 1 小節に何拍含まれるか
Transition 次にどこに行くか

4. 再生する

Music コンポーネントの Play メソッドを呼び出すと、音楽が再生される。

AudioSource の Play On Awake にチェックを入れておけば、シーン開始時に自動で再生される。(いつもどおり)

実装について

やったことは主に以下の3つ。

  1. 元の AudioSource から音データを取得し、各セクション毎の AudioSource に分割する。
  2. 各セクション毎の AudioSource を順次再生する。
  3. 再生中のセクションが終わりそうなときに、そのセクションの Transition によって次のセクションを決める。

他の手段

ミドルウェアを使う

日本のインディーゲーム界隈だと ADX2LE を使っているという情報を良く見る(気がする)。 Game Audio Table V2.7 | Audio Middleware Implementation Table によると Fabric も良さそう。 どちらも無料で使い始められる(売上が指定される金額未満の場合)のが最高。

ただしかなり多機能で、今回はそこまでの機能は必要ないかなーと思ったので見送った。

MusicEngine

geekdrums / MusicEngine という元ネタがあって、DDDMusic と同じことができる。 というか DDDMusic 以上のことができる。

ただし Transition を Through にすると、自分の環境ではうまく動かなかった。セクションの遷移時に再生位置がずれてしまうようだった。 最初はプルリクを出すつもりでコードを読み始めたけど、理解しきれなかったので結局自分で最初から書き直した。

参考にさせて頂いたので、geekdrums さんのライセンスを引き継いでいる。

まとめ・感想

  • Unity のデフォルトではイントロ付きループを再生する機能がないが、スクリプトを少し書けば実現できる
  • dddnuts / DDDMusic を使えば、コンポーネントひとつ追加するだけでイントロ付きループが再生できる
  • 他の手段として、無料で使い始められるミドルウェアや、geekdrums / MusicEngine がある

適当に書いたけど、そこそこいい感じに動いてるっぽくて、今のところ満足してる。