Unity連携編.03 / キューにタイミング情報を埋め込む

UnityにADX2導入するメリットのひとつに、多彩なキューの設定を利用してゲームの演出を豊かにできる点があります。
今回は、音データ側にタイミング情報を埋め込んでUnityで利用する方法について考えてみます。

BGMにあわせて画面の演出や敵の出現をする

横スクロールアクションゲームやRPGなどで、リズミカルなBGMに連動するように敵が出現したり、アイテムが飛び出たり、という演出をしたいと考えます。

ひとつの方法は、曲のビートにあわせて処理を行うやり方ですが、たんにビートに合わせたものではなく、曲のタイミングで何かゲーム側で演出をさせたい状況を考えます。

そんな時は、キューの「シーケンスコールバック」機能を使います。このキューを再生したときに、Unityのスクリプト側にタイミング情報を渡すことで、キューの中でゲーム内の演出を出したいポイントを決めることができます。
ちょうど、UnityのAnimatonにEventを埋め込むのと似たようなイメージです。

コールバックを設定したキューを用意

さっそくやってみましょう。まずはBGMのキューを何か用意します。

次に、キューの上で右クリックメニューを出し、「新規オブジェクト -> マーカーの作成」を選びます。

マーカの作成を選ぶと「マーカーの追加」ダイアログが表示されます。ダイアログでは、「タイプ」を「コールバック」に指定します。「タグ」にはUnityでコールバックイベントを受け取るときの判定文字列を入れます。今回は例として「EnemySpawn」としてみました。

設定が終わったら「追加」をクリックします。タイムラインにピンク色の「Cb」と書いてある線が表示されます。

この線の位置で、「タグ」に埋め込んだ文字列や「ID」をUnityスクリプト側に通知することができます。

Unity側の設定

スクリプトでどのようにこのタイミング情報を取得するか説明します。キューに設定したコールバックは、

CriAtomExSequencer.SetEventCallbackで取得できます。
しかし、このコールバックではキューに設定したコールバック内のIDやタグ、位置などの情報を1行の文字で固めて返すため、そのままでは少々使いにくいです。

そこで、このコールバックをいい感じの構造体に包んで返してくれる拡張機能を用意しました。

https://gist.github.com/TakaakiIchijo/bde623ce973c64b5ed11da3160f3c370

こちらの拡張にあるCriAtomExSequencerExtension.SetEventCallbackコールバックを通じて、構造体CriSequenceParamに各種データがパースされた状態で取得できます。

敵を出現させるスクリプトの例は次の通りです。

まず、Awake()オーバーライドメソッド内でenemyPrefabに設定されたゲームオブジェクトを生成し、プールしておきます。

今回はキューのコールバックに設定した「タグ」文字列で摘出減の判定を行います。

Start()では、CriAtomExSequencerExtension.SetEventCallbackコールバックのCriSequenceParam構造体のメンバeventTagの中身と文字列「EnemySpawn」を比較して、あっていたらSpawnEnemyメソッドをコールする仕組みにしています。

SpawnEnemyメソッドは、オブジェクトプールから一つランダムな位置にゲームオブジェクトを有効化するだけのメソッドです。

これで、タグ「EnemySpawn」を持つコールバックのタイミングが来るたびに、敵が出現します。

(図では全くわかりませんが、一応載せます)

応用方法

冒頭紹介したように、敵の出現の他にも、魔法や花火などの画面の演出でこのコールバックを使うと、BGMに連動したカットシーンの作成が楽になります。セリフのデータにマーカーを埋め込んで、セリフの喜怒哀楽に合わせて顔グラフィックを変える、といった演出にも使えます。

ぜひ、いろいろな使い方を試してみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です