マーカーとAnimationClipの連携
ときにアプリケーションの動作や演出などをサウンドと同期して動作させたい場合があります。この為にFC AudioToolsのWaveEditorは、AnimationClipのAnimationEvent情報へ、マーカーとテキスト情報のタイミングを出力できます。またJson形式でも入出力することができます。これは無限の可能性をアプリケーションに付与することができます。(例えばサウンドと同期したエフェクト、カメラワーク、字幕テキストなど)
注意しなければならないのは、これらはアプリケーション実行時のリアルタイム解析によっておこなわれるわけではなく、あらかじめサウンドに適したタイミングデータを用意する手法だということです。しかし、この手法による実行時のCPU負荷はきわめて小さくなります。
LoopMusicDemoでこの例を見ることができます。シーンではBGMのリズムに合わせてキューブが震えたりジャンプします。
(※機能的な制限により、このデモの完全な動作はUnity 5.3以降で動作させる必要があります)
AnimationClip(AnimationEvent)以外の独自の実装でコントロールしたい場合は、同様にWaveEditorはJson形式で出力することよってマーカーとテキストデータを利用することができます。もしAnimation処理のコンポーネントに詳しくない場合、公式のリファレンス( Animationウィンドウ、AnimationEvent 、Animatorウィンドウ)を確認してください。特に必要な処理はAudioClipとAnimatorの時間を同期させることと、同時に再生をおこなうことです。
アニメーションイベントへの出力手順
マーカー等の情報をAnimationClipへ出力するにはメニューから、 ファイル > エクスポート > マーカー > AnimationClip を選択してください。幾つかの設定をおこなうためのダイアログが表示されます。
AnimationClipのAnimationEventタイムラインの生成をカスタマイズするためのダイアログです。設定ダイアログの決定ボタンを実行し、AnimationClipファイルを保存するパスを選択します。
※この設定ダイアログの内容はUnityスクリプトに関する動作の知識が必要になります。必要が無い場合は初期状態で使用し、必要に応じてプログラマと共同で設定されることをお勧めします。
WaveEditor上のループイベント
WaveEditor上のマーカーイベント
マーカー用関数名は、マーカーが存在するタイミングで発生させるコールバック関数名です。
ループ用関数名は、ループの開始と終了、クリップの終了で発生させるコールバック関数名です。
以下は設定ダイアログの内容がAnimationClip(AnimationEvent、Animationウィンドウのどの部分と対応しているかを示します。
マーカー用アニメーションイベントのパラメータ仕様
Function, スクリプトのコールされる関数名です。初期はOnAudioMarkerEventです。
Float, 現在設定されません。将来の予約パラメータです。
Int, マーカー番号です。この番号はWaveEditor上で表示されている数値と同じです。
String, マーカーに設定している名称(テキスト)です。自由な文章をAnimationEventのデータとして使用したい場合、マーカーに名称を設定することで、その内容をAnimationClipに設定されます。
Object, 使用されません。
ループ用アニメーションイベントのパラメータ仕様
Function, スクリプトのコールされる関数名です。初期はOnAudioLoopEventです。
Float, 現在設定されません。将来の予約パラメータです.
Int, 0はループ開始位置を意味します。1はループ終了位置を意味します。2はアニメーション末尾であることを意味します。
String, ループ開始位置では「loopStart」 、ループ終了位置では「loopEnd」、アニメーション末尾では「clipEnd」になります。これらの文字列は固定です。
Object, 使用されません。
Jsonデータの仕様
AnimationEventではなく、独自の実装でイベントをトリガーしたい場合、Json形式のファイルをソースとして使用することができます。WaveEditorはJson形式のデータを出力できます。メニューから ファイル > エクスポート > マーカー > Json を選択します。
エクスポートだけでなく、インポートをおこなうこともできます。メニューから ファイル > インポート > マーカー > Json を選択します。
インポートにより、既存のマーカーとループは全て置き換えられます。もしJsonデータにループ情報、マーカー情報の何れかが欠けていた場合は、その情報の置き換えは無視します。
エクスポートとインポートをするJsonファイルの構造は以下のようになります。
loop, ループ情報がある場合にこの構造を持ちます。loop構造の構成は以下のようになります。
startTime, ループ開始位置を表す時間。単位は秒。
endTime, ループ終了位置を表す時間。単位は秒。
startSample, ループ開始位置を表すサンプル位置。startTimeと同様ですが、PCMデータを基準にした値です。この値はstartTimeより優先します。
endSample, ループ終了位置を表すサンプル位置。endTimeと同様ですが、PCMデータを基準にした値です。この値はendTimeより優先します。
markers, マーカー情報を持つ場合にこの配列を持ちます。各要素の構造は以下のようになります。
time, マーカー位置を表す時間。単位は秒。
sample, マーカー位置を表すサンプル位置。timeと同様ですが、PCMデータを基準にした値です。この値はtimeより優先します。
Id, マーカー番号。WaveEditorで表示される番号と同じ値です。
text, マーカー名称。イベント情報に自由テキストが必要な場合に使用します。このテキストはマーカー名称に設定した内容が含まれます。
ファイル内容の例