はじめに
背景のオブジェクトとかを音楽に合わせて動かしたいといったことが稀にあります。
デモ
誰が担当するのかが難しい音楽同期演出
ゲームで作ろうとすると
まずデザイナーさんがアニメーションを作成します。
次に プログラマが音にタイミングを合わせようとします。
VJソフトのようにアニメーションを合わせたくても
Unity標準ではそういった情報はありません。
ビート進捗情報を得る
曲のビート進捗情報があると合わせることができます。
曲の再生時間を利用します。
例えばこんなコードになります。
public float PlayingTime => m_AudioSource.time;
/// <summary> 拍の進捗(0.0f~1.0f) </summary>
public float BeatProgress
{
get
{
if (m_Data == null || m_Data.Bpm <= 0f)
{
return 0f;
}
// PlayingTime は秒単位なので、60で割って分単位にし、BPMを掛けて総拍数を計算します。
// その後、1.0fで剰余を計算することで、現在の拍の進捗 (0.0f~1.0f) を得ます。
return (PlayingTime / 60.0f * m_Data.Bpm) % 1.0f;
}
}
音楽データについて
まず音楽は一定のBPM(テンポ)で作成しておきます。
途中で変わるのは今回はなし。
また、曲のはじめが拍の頭になるようにします。
音楽は一定の周期を繰り返しています。
4つうちのテクノのような音楽であればわかりやすいです。
音楽の付与情報
音楽のwavファイルに対して BPMという情報を一つ割り当てておき
ビートの進捗率を返すようにしています。
この情報を利用して映像を合わせるようにすることができます。
BeatProgressの使い方
再生中は 0.0~1.0の値が得られるので、
この周期の始まり部分が取得できれば、音楽と映像を同期させることが可能になります。
例えば、1から0に変化したタイミングを狙って再生をトリガーしたり
アニメーションの再生位置に割り当てたりといった使い方ができます。
ずれているのも演出?
ずれている方は、それはそれで奇妙な感覚にもなりえます。
(不安な気持ちとか)
また、じっとしていると気が付くのですが、
早く動き回っていたりすると気が付かない可能性もありますので、
使いどころは検討の余地があります。
(早く動き回っている場合はそこまで気にしなくてもよかったりする)
おわりに
サウンドデザイナーだけではなかなか難しいですが、
プログラマさんに 上のコードでできますと伝えれば簡単に実装できるかと思いますので、
もしあれば試してみてください。