Unity連携編.01 / アニメーションと連動してSE再生をトリガーする手順
本連載はUnity for ADX2の具体的な利用方法について紹介します。
アニメーションと音
Unityでゲームを開発している際、キャラクターアニメーションと音の再生を連動したいことがあります。
たとえばキャラクターの足音や、攻撃したときに武器が空気を切る音などがそれにあたります。
Unityのアニメーションシステムには、アニメーションフレームごとにスクリプトへコールバックをかけるトリガーを埋め込むことができます。
今回はこの機能を使ってADX2で作成したキューの再生をトリガーしようと思います。
今回は、パンチのアニメーションに対して、「シュッ!」という腕の風切り音をつける操作を想定して作業します。
AtomCraft側の操作
AtomCraft側は特に特別な操作は必要ありません。通常のキュー作成と同様です。
アニメーションと連動したSEの場合はほとんどが3Dポジショニングデータになるかと思いますので、その設定を忘れずやっていただければ大丈夫です。
キャラクターのアニメーションにかかわる効果音は、キャラクターごとにキューシートをまとめると管理しやすいかと思います。
たとえばPlayerActionSEsやPlayerAnimationSfxのような名前でまとめ、そのキャラクターが登場するシーンで読み込むようにしましょう。
Unity Editor 側の操作
まずは音を付けたいアニメーションの中にトリガーを埋め込んでみます。
プロジェクトウィンドウ内のアニメーションデータを選択し、インスペクター内でタブ「Animation」を選択します。
インスペクターの下の方にある「Events」セクションを開きます。
次に音を鳴らしたいタイミングを指定します。
これがポイントなのですが、Eventsのタイムラインではなく、その下のアニメーションプレビュー内にあるタイムラインのバーを左右に動かすことでタイミングの指定ができます。
このタイミングかな、と思ったところでEventsの直下にあるAdd Eventボタンをクリックします。
そうすると指定のフレームにEventが追加され、下のフィールドに文字や数値を入力することができるようになります。
「Function」はこのタイミングで呼び出したい関数の名前、その下の「Float」「Int」「String」は引数渡しになります。
自分で作る関数を呼び出す機能なので、関数の名前に決まりはありません。
今回このタイミングで実行したいことは「SEの再生」ですので、関数名は「PlaySe」と決めて、鳴らしたいキュー名をStringで渡す設定にしてみましょう。
ここではキュー名「PunchWind」を呼ぶ形にします。
スクリプティング
Animationのイベントは、アニメーションが再生されるモデルデータと同じゲームオブジェクトに貼り付けられているスクリプトを呼び出すことになっています。
さきほど関数名をPlaySe、引数はStringでキュー名を渡すことを考えましたので、AtomSourceに対してこれらの情報を渡し、再生を開始する関数を用意します。
非常にシンプルですね。
モデルデータと同じGameObjectにこのスクリプトとAtomSourceコンポーネントをアタッチし、フィールド「atomSource」にインスペクター内で参照を入れれば完了です。
ただし、指定したキュー名およびキューシートが読み込まれていない場合はエラーになりますので、アニメーションが再生される場面より前にキューシートを読み込むようにしましょう。
また、今回はSeの名称だけ指定していましたが、floatのパラメーターが空いているので、同時にボリュームやピッチなどを渡すことができそうです。
同時に複数のパラメーターを渡したい場合は、パラメーターを詰めたクラスをScriptableObject化して「Object」に指定することでスクリプト側へ渡すことができます。
もし「こんなSE演出の時はどうするの?」という質問がありましたら、ぜひコメントください!