長いからいきなり本題
Unityで音楽とオブジェクトの動きを連動させたい場合「Koreographer」というアセットが有名ですが、アセットストアの中では結構高価なアセットということもあってか中々「Koreographer」を取り上げたブログ記事が少ないです。
Google先生に何度尋ねても「Koreographer」について詳しい使い方が載っているのは以下の記事しか見つかりませんでした。
なので自身の備忘録も含めて「Koreographer」について調査した内容を記事にしたいと思います。(たぶん数回にわたる)
Koreographerの概要
「Koreographer」がどんなアセットなのかをザックリ言えば、楽曲に合わせて事前に設定したタイミングでイベントを発行してくれるアセット、と言えます。
イベントを発行してくれるだけなので、「Koreographer」が曲に合わせてオブジェクトを飛び跳ねさせたり、色を変えたりしてくれるわけではありません。
そこらへんの動作は自分で作り込む必要があります。
楽曲(AudioClip)とKoreographerと動かしたいGameObjectの関係を図で表すと下のような感じになります。
イベントを発行してくれるだけ、とはいえ、「Koreographer」ではその後の動作が作りやすいように、イベント発行時に「Payload」と呼ばれるメタデータを指定してGameObject側へ渡すことができます。
例えば、歌詞が歌われるタイミングでその歌詞を「Payload」で渡し、画面に表示するようにすればカラオケっぽいものが作れます。
(そこらへんの話は上記のリンク先でも書いてあります)
指定できる「Payload」の種類は以下の通り
- Int:int値を指定
- Float: float値を指定
- Text: 文字列を指定
- Curve: AnimationCurveを指定
- Color: Colorを指定(Professional版のみ)
- Gradient:ColorGradientを指定(Professional版のみ)
「Koreographer」にはLite版とProfessional版があり、「Payload」にColorとGradientを指定できるのはProfessional版のみとなっています。当然ながらProfessional版は結構な値段がするので用途に合わせてどちらを購入するか検討する必要があります。
イベントの種類
イベントの設定には専用のエディタを使用します。
専用エディタで楽曲のファイルを指定するとその波形が画面に表示されます。そこに楽曲のBPMを指定するとビートに沿ったグリッドを表示してくれるので、そのグリッドをクリックしてイベント発生のタイミングを設定します。
(つまりビートに沿ったタイミングでイベントが発行できる)
白い線がグリッドで1ビートの間隔を表しています。上の図では4ビート(1小節)単位に太い線が引かれています。
「Koreographer」には二種類のイベントがあります。イベント発生のタイミングを設定する際にどちらのタイプのイベントなのかを指定し、そのタイプに沿った「Payload」を使用してイベントが発行されるようにします。
- OneOffイベント:開始タイミングのみ指定⇒使用するPayload:int,float,Text,Color
- Spanイベント:イベントの開始と終了を指定⇒使用するPayload:Curve,Gradient
OneOffイベントの場合、一回だけイベントを発行します。何かの処理の開始タイミングを計りたい場合などにこのイベントを使用します。同じイベントを繰り返し発行したい場合は、その数だけエディタで指定する必要があります。
Spanイベントの場合、指定した期間内では毎フレームイベントが発行されます。徐々に変化するような動作をさせたい場合などにこのイベントを使用します。フレーム単位でイベントが発行されるので重い処理をする際には注意が必要です。また、イベントの発行がビート単位ではないことも考慮する必要があります。(私はここを勘違いしてた)
では実際に使ってみよう
「Koreographer」のシーンへの導入方法やスクリプトへの組み込み方などは、上記のリンク先に記載がありますし、アセットのサンプルシーンでも確認できるので省くとして、実際にエディタでイベントを設定した画像がこちら
真ん中で帯状に表示されているものがSpanイベントで、「Payload」にはGradient(徐々に色が変わる)が指定されています。
見づらいですが赤の線はOneOffイベントで「Payload」にはColorが設定されています。
ここまで専用エディタで設定したら、ゲームシーン内に音に合わせて動かしたいGameObjectを設置します。今回は一列に並んだCubeを使用します。
こんな感じ
Spanイベントが発行されたら全てのCubeが同時にGradientに沿って色が変わるように、OneOffイベントが発行されたら先頭から順にColorの色へ変わるようにスクリプトを組みます。
それを実行した結果が下の動画になります。(注意:結構音量がデカいです)
音楽はFLASH☆BEATさんのNew Departureを使用しています。
一つ一つは単純な動作なんですが「Koreographer」を使って楽曲に合わせてリンクさせると効果的な演出が作れると思います。
ただ、やっぱり高価なアセットなので購入を躊う方もいるでしょうし、もっと情報が欲しい、と思う方もいらっしゃると思うので、次回もこの「Koreographer」についての記事を書きたいと思っています。