Live2Dでは、モーションの途中にイベントを埋め込むことができます。
今回はLive2DモデルをUnityにインポートし、イベントのタイミングで効果音を鳴らすための手順を解説します。
- [Live2D] モーションデータのなかにイベントを作成する
- [Live2D] モーションデータを書き出す
- [Unity] model3.jsonとMotionsファイルをUnityにインポートする
- [Unity] Live2Dのイベントをキャッチ&効果音を再生するためのスクリプトをアタッチする
- [Unity] CubismMotion3Json.csを編集し、4のFunctionNameがデフォルトで設定されるようにする
1.[Live2D] モーションデータのなかにイベントを作成する
Live2Dのアニメーション作成画面を開き、効果音を鳴らしたいタイミングにイベントを設置します。
対象のフレームを選択した状態で、右クリックから「イベントの設定」を選びます。
すると下記のような入力画面が表示されます。
Live2Dのmotion3.jsonをUnityにインポートすると、モーションはAnimationClip形式に変換されます。
ここで入力する文字列は、そのなかのstringParameterとして設定されます。
そのため、ここでは効果音を識別するためのIDを設定するのがオススメです。
効果音再生用スクリプトを、PlaySFX(audioID)のように設計しておけば、複数の効果音を使い分けることができます。
アニメーションを再生しながらイベントを設定していきましょう。
2.[Live2D] モーションデータの書き出し
1で作成したモーションデータの書き出しを行います。
組み込み用ファイル書き出し > モーションファイル書き出しを選択します。
このとき、「イベントを書き出し」にチェックを入れるのを忘れないでください。
3.[Unity] model3.jsonやMotionsファイルをUnityにインポートする
作成したmodel3.jsonやMotionsファイルを、そのままUnityにドラッグアンドドロップするだけです。
4.[Unity] SE再生用スクリプトをLive2DのPrefabにアタッチする
Live2Dで設定したモーションデータは、UnityのAnimationClipに変換されます。
Live2Dで設定したイベントは、そのクリップの中のAnimationEventとして設定されます。
生成されたAnimationClipを確認します。
設定したイベントに対応するAnimationEventが設定されているのがわかります。
AnimationEventも確認します。
最初の手順で入力した文字列がStringに設定されているのがわかります。
しかし、FunctionNameは空白です。
このままでは何も再生されないため、効果音再生用スクリプトをLive2DのPrefabに追加でアタッチして、再生用のFunctionNameを入力します。
必ずAnimatorと再生用スクリプトが同じオブジェクトにアタッチされているのを確認してください。
そうでないとAnimationClipは再生用関数を見つけることができません。
SE再生用関数については、いろいろ方法があると思うので割愛します。
例えば、public void PlaySFX(string audioID)のような形で実装したとしましょう。
この場合、スクリプトをAnimatorと同じLive2DのPrefabにアタッチして、上記AnimationEventのFunctionNameに手動で「PlaySFX」と入力すればSEが再生されます。
5.CubismMotion3Json.csを編集してFunctionNameがデフォルトで設定されるようにする
設定したイベントの数が少ないなら、手動で設定しても良いでしょう。
しかし、イベントの数が多いとFunctionNameそれぞれ入力し直す必要があるので手間です。
それに、将来的にモーションデータを更新したときにFunctionNameが再び空白になるので面倒です。
Live2Dのイベント設定は、引数となるStringの内容を指定することは出来ますが、FunctionNameを直接指定する ことはできません。
ですが、motion3.jsonの変換を担うCubismMotion3Json.csに関数名を追記することで、インポートと同時にFunctionNameを設定することができます。
Live2D > Cubism > Framework > Json > CubismMotion3Json.csを開いてください。
そのなかでfunctionName(今回はPlaySFX)を追記します。これによりインポート時にPlaySFXが自動で設定されるようになります。
var animationEvent = new AnimationEvent{
time = UserData[i].Time,
functionName = "PlaySFX",
stringParameter = UserData[i].Value,
}
設定が反映されない場合は、motion3.jsonなどを右クリックしてReimportしてみましょう。