ちゃこブログ

お絵かきとUnityとBlenderと日記

【Unity】RhythmTimeline、MusicTimelineを作った

Timelineにて音楽と同期した演出を作りたい場合に役に立つRhythmTimeline・MusicTimelineを制作しました。

両者は名前がすごく似てるのですが、おおまかに以下の違いがあります。

RhythmTimeline:メトロノームのようにBPMを指定してイベントを発火するもの
MusicTimeline:じーくどらむすさんのMusicEngineをTimeline上で扱うようにしたもの(ざっくり)

RhythmTimelineの方は音源そのものを必要としませんが、MusicTimelineの方はAudioClipからTimelineClipを作成します。

両方に共通する機能は、Timeline上での拍の可視化と、1小節(Bar)・1拍子(Beat)のタイミングでイベントを発火させる機能です。
これらの機能だけで、音楽に合わせた演出というのが簡単に制作することが可能になります。

github.com
github.com
MusicTimelineの方は修正が困難なバグがいくつかあってver0.1としています;;

このアセットを使ったサンプルをUnityPlayにアップロードしてみました。(RhythmTimelineがWebGLでは使えないので、以下はMusicTimelineを使っています)
play.unity.com

RhythmTimeline

こちらの制作にあたっては、Unity公式のメトロノームのサンプルを利用しました。
docs.unity3d.com
それで使われているOnAudioFilterRead関数は、WebGLでは動かすことができないようです。なのでRhythmTimelineはWebGL向けの制作の場合は使うことができないので注意が必要です。
また、使用するときはUniRxも一緒に入れてください。OnAudioFilterRead関数は別スレッドで呼ばれるものであるため、UnityEventを使うためにはメインスレッドで呼ぶ必要があるため、この処理を行うためにUniRxを使っています。

使い方

RhythmEngineComponentがついたGameObjectをシーン上に作成し、RhythmTimelineTrackにバインドします。
Clipを作成し、ClipのInspectorでBPMの指定・拍子などの設定を行います。
Barは何拍子にするか、Beatは4ビートか8ビートを選択できます。

f:id:charcotte:20211214185527p:plain

RhythmEngineのOnBar()、OnBeat()にイベントを登録すればそのタイミングでイベントが発火されるシステムが作れます。
再生や停止はPlayableDirectorの方で操作してください。

MusicTimeline

じーくどらむすさんが公開しているMusicEngineのアルゴリズムを用いてTimelineで扱えるようにしたものです。音楽系ド素人が移植したのでアルゴリズムが合ってるのかどうか正直わかりません…
github.com
基本的な機能に加えてMusicEngineの機能である曲をセクションごとに区切る機能・セクション内ループ・セクション移動などのMusicEngineの基本的な機能を移植しました。

使い方

MusicEngineComponentがついたGameObjectシーン上に作成し、MusicTimelineTrackにバインドします。
Clipを作成し、セクションを設定します。セクションごとに何拍子かなどを個別に設定できるので理論上は変拍子に対応できるはずです。
f:id:charcotte:20211214190624p:plain
MusicEngineのOnBar()、OnBeat()関数などにイベントを登録すればそのタイミングでイベントが発火されるシステムが作れます。
再生や停止はPlayableDirectorの方で操作してください。

まとめ

Timelineの拡張がとても楽しくて止まりませんでした。
実は2年前に作ってたものなのですが、途中で開発がストップしてたので最近時間ができて着手しはじめた感じです。Unity2021になってもTimeline周りのAPIに大幅な変化がなくて安心しました。
EditorでのPreview機能が全然実装できそうにないのでもう少し研究が必要そうです…