【Unity】Live2Dモーションに組み込んだイベントのタイミングで効果音を鳴らす方法

2024/02/032025/04/09ゲーム開発Live2DUnity

Live2Dで作成したキャラクターアニメーション(モーション)には、タイムライン上の特定のフレームに「イベント」というマーカーのようなものを埋め込む機能があります。このイベントは、Unityにモデルをインポートした後、モーション再生中の特定のタイミングでUnity側の処理(例えば効果音(SE)の再生、エフェクトの表示など)を呼び出すトリガーとして活用できます。

この記事では、Live2D Cubism Editorでモーションにイベントを設定し、それをUnityプロジェクトにインポート、そして設定したイベントのタイミングで効果音を鳴らすための具体的な手順と、さらに効率化するためのTipsを解説します。


この記事で解説する手順

  1. [Live2D] モーションデータ内にイベントを作成・設定する
  2. [Live2D] イベント情報を含めてモーションデータを書き出す
  3. [Unity] モデルとモーションファイルをUnityにインポートする
  4. [Unity] イベントを受け取り効果音を再生するスクリプトと設定
  5. [Unity] SDKスクリプト編集でイベント関数名の自動設定(効率化Tips)
  6. オススメ参考情報

[Live2D] モーションデータ内にイベントを作成・設定する

まず、Live2D Cubism Editorのアニメーション作成画面(タイムライン)を開き、効果音を鳴らしたいフレーム(タイミング)にイベントを設定します。

  1. タイムライン上で、イベントを設定したいパラメータグループ(例: `Expression`など、どこでも可)を選択します。
  2. 効果音を鳴らしたいフレームに再生ヘッド(赤い縦線)を移動させます。
  3. そのフレーム上で右クリックし、「イベントの設定」を選択します。(または、タイムライン上部のイベント用トラックで直接右クリック)
Live2D Editorのタイムラインでイベントを設定する

すると、イベントの文字列を入力するダイアログが表示されます。

Live2Dイベント設定の入力ダイアログ

ここに入力した文字列は、後でUnityにインポートした際に、モーション(AnimationClip)内のAnimationEventstringParameter(文字列パラメータ)として渡されます。

そのため、単に「SE」と入力するだけでなく、再生したい効果音を識別するためのIDや名前(例: `Footstep`, `AttackSE_01`, `Voice_Happy`など)を設定するのがおすすめです。こうすることで、Unity側のスクリプトでこの文字列を受け取り、PlaySFX(audioID) のように、再生する効果音を動的に切り替えることが可能になります。

必要なタイミングにイベントを設定していきましょう。タイムライン上に黄色いマーカーとして表示されます。

タイムライン上に設定されたイベントマーカー

[Live2D] イベント情報を含めてモーションデータを書き出す

イベントの設定が完了したら、モーションデータをUnityで読み込める形式(.motion3.json)で書き出します。

  1. Live2D Editorのメニューから「ファイル」>「組み込み用ファイル書き出し」>「モーションファイル書き出し」を選択します。
  2. 書き出し設定ダイアログが表示されます。
  3. 【重要】 設定項目の中にある「イベントを書き出し」のチェックボックスに必ずチェックを入れてください。これを忘れると、せっかく設定したイベント情報がファイルに含まれず、Unity側で受け取ることができません。
Live2Dモーションファイル書き出しメニュー
モーション書き出し設定で「イベントを書き出し」にチェックを入れる

設定を確認したら「OK」を押し、.motion3.jsonファイルを書き出します。

[Unity] モデルとモーションファイルをUnityにインポートする

Live2Dモデル本体のデータ(.model3.jsonファイルやテクスチャ等が含まれるフォルダ)と、先ほど書き出したモーションファイル(.motion3.json)をUnityプロジェクトにインポートします。

通常は、これらのファイルやフォルダをUnityのProjectウィンドウにドラッグ&ドロップするだけで、Live2D Cubism SDK for Unityが自動的に処理を行い、モデルのPrefabやモーションのAnimationClipなどが生成されます。

(Live2D Cubism SDK for Unityがプロジェクトに導入されていない場合は、先に導入が必要です)

参考: SDKをインポートしてモデルを表示する – Live2D公式ドキュメント

[Unity] イベントを受け取り効果音を再生するスクリプトと設定

Unityにモーションファイルをインポートすると、Live2D Editorで設定したイベントは、生成されたAnimationClip内の「Animation Event」として自動的に変換・登録されます。

確認してみましょう。生成されたAnimationClipアセットを選択し、Animationウィンドウ(またはInspectorウィンドウのEventsセクション)を開きます。

UnityのAnimationウィンドウで生成されたAnimationEventを確認

タイムライン上に、Live2Dで設定したタイミングでイベントマーカーが表示されているはずです。そのマーカーを選択すると、詳細を確認できます。

AnimationEventの詳細:Stringパラメータにイベント文字列が設定されている

String」パラメータには、Live2D Editorでイベントに設定した文字列(例: `Footstep`)が正しく入っていることがわかります。

しかし、このままではまだ効果音は鳴りません。なぜなら、「Function」欄が空欄だからです。Animation Eventは、指定された関数(Function Name)を、そのイベントを持つAnimatorコンポーネントと同じGameObjectにアタッチされているスクリプトから呼び出す仕組みになっています。FunctionNameが空だと、どの関数を呼び出せば良いか分からず、何も実行されません。

そこで、以下の手順で効果音再生用のスクリプトを作成し、設定を行います。

  1. 効果音再生用スクリプトを作成: 以下のような、文字列を引数として受け取り、対応する効果音を再生する関数を持つC#スクリプトを作成します(内容はあくまで例です。ご自身のプロジェクトの効果音再生システムに合わせて実装してください)。
    using UnityEngine;
    
        public class Live2DSoundPlayer : MonoBehaviour
        {
            // 効果音のAudioSourceなどを設定(Inspectorなどから)
            public AudioSource audioSource;
            // 効果音クリップの管理方法(例: Dictionaryや配列など)は適宜実装
            // public AudioClip footstepClip;
            // public AudioClip attackClip;
    
            /// 
            /// AnimationEventから呼び出される関数。
            /// 引数(audioID)にはAnimationEventのStringパラメータが渡される。
            /// 
            /// 再生したい効果音のID(Live2Dイベントで設定した文字列)
            public void PlaySFX(string audioID)
            {
                Debug.Log("PlaySFX called with ID: " + audioID);
                // audioIDに基づいて再生するAudioClipを決定し、再生する処理
                // 例:
                // if (audioID == "Footstep" && footstepClip != null)
                // {
                //     audioSource.PlayOneShot(footstepClip);
                // }
                // else if (audioID == "AttackSE_01" && attackClip != null)
                // {
                //     audioSource.PlayOneShot(attackClip);
                // }
                // ... など
            }
        }
        

  2. スクリプトをアタッチ: 作成した効果音再生用スクリプト(例: `Live2DSoundPlayer.cs`)を、Live2DモデルのPrefabのルートGameObjectAnimatorコンポーネントがアタッチされているGameObject)に追加(アタッチ)します。

    【重要】Animatorと同じGameObjectにアタッチしないと、Animation Eventが関数を見つけられません!
  3. FunctionNameを手動設定: 再度、モーションのAnimationClipをAnimationウィンドウで開きます。各Animation Eventマーカーを選択し、Inspectorウィンドウの「Function」欄に、作成したスクリプト内の関数名(例: `PlaySFX`)を手動で入力します。

これで、モーションが再生され、イベントが設定されたフレームに到達すると、指定した`PlaySFX`関数が呼び出され、引数としてLive2Dで設定した文字列(効果音ID)が渡されるようになります。関数内でそのIDに応じた効果音を再生する処理を実装すれば、目的の動作が実現します。

[Unity] SDKスクリプト編集でイベント関数名の自動設定(効率化Tips)

前のステップで、Animation EventのFunctionNameを手動で設定する方法を説明しましたが、イベントの数が多い場合や、Live2D側でモーションを修正して再インポートするたびに設定し直すのは非常に手間がかかります。

Live2D Editor側でイベントの文字列(パラメータ)は設定できますが、呼び出す関数名(FunctionName)を直接指定することはできません。しかし、Unity側でモーションファイル(.motion3.json)をインポートする際の処理をカスタマイズすることで、FunctionNameを自動的に設定させることが可能です。

これを行うには、Live2D Cubism SDK for Unityに含まれるスクリプトファイルを編集します。

  1. UnityのProjectウィンドウで、以下のパスにあるスクリプトファイルを探して開きます。
    Packages/Live2D Cubism/Framework/Json/CubismMotion3Json.cs
    (※SDKのバージョンやインストール方法によってパスが異なる場合があります。Assetsフォルダ内に直接インポートしている場合はそちらを探してください)
  2. スクリプト内でToAnimationClipメソッドの中を探し、AnimationEventを生成している箇所を見つけます。(new AnimationEvent と書かれているあたりです)
  3. そのAnimationEventを生成するコードに、functionNameの行を追加(または編集)し、呼び出したい関数名(例: `”PlaySFX”`)を直接文字列で指定します。
    // CubismMotion3Json.cs の ToAnimationClip メソッド内の一部を編集
    // (元のコード構造に合わせて編集してください)
    
    var animationEvent = new AnimationEvent
    {
        time = UserData[i].Time, // イベントの発生時間
        // ここに呼び出したい関数名を直接記述!
        functionName = "PlaySFX",
        stringParameter = UserData[i].Value, // Live2Dで設定したイベント文字列
    };
    

  4. スクリプトを保存します。

この変更により、今後.motion3.jsonファイルをUnityにインポート(または既存のファイルを右クリックして「Reimport」)した際に、生成されるAnimationEventFunctionNameフィールドに、指定した関数名(この例では “PlaySFX”)が自動的に設定されるようになります。これにより、手動でFunctionNameを入力する手間が省け、モーション更新時の作業も大幅に効率化されます。

【注意】SDKのスクリプトを直接編集する方法は、SDKのアップデート時に変更が上書きされてしまう可能性があるため、その点は留意が必要です。変更箇所を記録しておくか、可能であればより安全なカスタマイズ方法(例えば、インポート後の後処理スクリプトを作成するなど)を検討するのも良いでしょう。

参考: motion3.jsonに設定されたイベントを取得する – Live2D公式ドキュメント

オススメ参考情報

今回の実装にあたり、以下の情報が大変参考になりました。

この記事をシェアする