【Unity】 Live2D Cubism SDKの導入と使用方法（個人用まとめ）

## はじめに
こんにちは。

Live2DのUnityでの導入方法や実際に動かす方法をまとめた記事です。



[1. 環境構築](#環境構築)

[2. Live2DにAnimationを適用して動かす](#live2dにanimationを適用して動かす)

[3. Unityのパラメータによってモーションを切り替える方法](#unityのパラメータによってモーションを切り替える方法)

[4. スクリプトからLive2Dのパラメータを変化させる](#スクリプトからlive2dのパラメータを変化させる)

[5. Live2Dのスピードを変化させる](#live2dのスピードを変化させる)

[6. アニメーションのフレーム位置にSEなどの音を付ける](#アニメーションのフレーム位置にseなどの音を付ける)


## 環境構築
2. Live2D Cubism SDK for Unityをダウンロードします。
https://www.live2d.com/sdk/download/unity/

2. 新しいUnityプロジェクトを起動し、上でダウンロードしたSDKをドラッグ＆ドロップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/42d4d32f-921c-b0f9-4795-1d73646ed122.png)
3. 以下のサンプルLive2Dアニメーションが動くことが確認できればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/97ee3e13-4a10-7ac1-bf2e-0d9271ce83fa.png)

## Live2DにAnimationを適用して動かす
1. Live2Dをプロジェクトにドラッグ＆ドロップ
1. Prehub（青立方体）が生成されるのでヒエラルキーにドラッグ＆ドロップ
4. AnimationクリップをPrehubにドラッグ＆ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/9207e6ec-544b-056d-e838-926c9d43d9dc.png)
5. 実行ボタン押して適用したアニメーションが動くことを確認してみてください。

- Animationクリップと、Animator Controllerの意味
　・Animationクリップ　：１つのモーション。最小単位。
　・Animator Controller　：複数のモーションの関係や遷移を管理する。

- ウィンドウ＞アニメーション＞**アニメーション**
アニメーションでは、Animationクリップの中身を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/5df03cda-3860-63bf-47df-3cec79326d33.png)

- ウィンドウ＞アニメーション＞**アニメーター**
アニメーターは、複数のAnimationクリップの関係や流れを管理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/11356bde-220b-e301-e45c-7e0a0094f97f.png)

## Unityのパラメータによってモーションを切り替える方法
パラメータを使用することで、任意のタイミングでモーションを切り替えることができます。パラメータはBooleanやTriggerの形式で持つことができす。

1. 以下の図のように新しくステートを作成し、右クリックで遷移を作成をクリックし、矢印を相互に引きましょう。
※以下の例ではmo_1がtrueの場合に矢印の先に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/d5cd907c-83c6-d90a-79cb-5a316d9a7b8a.png)
2. Animatorに対してSetBoolする処理をスクリプトに記載する例です。
``` C#
    public Animator anim;

    public void SetBoolParam(string boolPamamName, bool setTrue) 
    {
        anim.SetBool(boolPamamName, setTrue); //Boolean
    }

    public void SetTrigger(string triggerName) 
    {
        anim.SetTrigger(triggerName); //Triggerも同様
    }
```

# スクリプトからLive2Dのパラメータを変化させる
必ずLateUpdateの中から動かさないとパラメータが変化しないので注意してください。
```C#
using UnityEngine;
using Live2D.Cubism.Core;

public class Live2dCustomScript : MonoBehaviour
{
    private CubismModel _model;

    void LateUpdate() // LateUpdate・・・様々な計算が終わった後の最終調整を書くところ
    {
        FindParam("ParamEyeLOpen").Value -= 20; //直接パラメータを変化させる。
    }

    //パラメータ名をCubismParameterに変換する
    public CubismParameter FindParam(string paramId) 
    {
        CubismParameter[] cp = _model.Parameters;
        foreach (CubismParameter cubismParameter in cp){
            if (paramId == cubismParameter.Id){
                return cubismParameter;
            }
        }
        throw new System.Exception("指定されたIDを持つParametaterがありません。" + "ID：" + paramId);
    }
}
```
参考資料
[【Unity＋Live2D】UnityからLive2Dモデルを触るときの個人的メモ](https://koroworks.jp/%E3%80%90unity%EF%BC%8Blive2d%E3%80%91unity%E3%81%8B%E3%82%89live2d%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%A7%A6%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E5%80%8B%E4%BA%BA%E7%9A%84%E3%83%A1%E3%83%A2/)

# Live2Dのスピードを変化させる
```C#
    public Animator anim;
    public slider;
    
    public void SpeedChange()
    {
        anim.speed = slider.value / 10f; //総数10のsliderを使う場合
    }
```

## アニメーションのフレーム位置にSEなどの音を付ける
1. アニメーションタブを開く。（アニメーションタブはCtrl + 6でも開けます）
2. 時間が表示されている領域で右クリックし、「アニメーションイベントを追加」を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/1888405b-7958-b34e-d55d-2c945cbada8a.png)


2. 実行したいスクリプトを、Live2DのPrehubオブジェクトにAddComponentします。
3. インスペクターのFunctionの中から、実行したいスクリプトを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/26e90d97-d145-25af-a2a6-47c0af110046.png)
スクリプトの例。以下のように配列でAudioClipを整理すると管理しやすいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/9453d714-ae2a-5229-e70a-cd72f7df4473.png)

手順としては以下の流れです。
1. **SoundFlame.cs**を作成し、Live2DにAddcomponentする
2. インスペクターのFunctionでrunSeMethod1を選択する。
3. **SoundSeManager.cs**を作成し、別のオブジェクトに付けておく。
これを応用すれば任意のスクリプトを実行することも可能となります。

``` C#:SoundFlame.cs：Live2Dに付けるスクリプト。SoundSeManagerを呼ぶ。
using UnityEngine;

public class SoundFlame : MonoBehaviour
{
    public AudioClip[] soundSe1;
    public SoundSeManager
    
    private void runSeMethod1(int no)
    {
        soundSeManager.Call(soundSe1[no]);//SoundSeManagerを呼ぶ
    }
}
```
``` C#:SoundSeManager.cs：SoundFlame.csからAudioClipを受け取り、audioSource.PlayOneShotを実行する
using UnityEngine;

public class SoundSeManager : MonoBehaviour
{
    private AudioSource audioSource;
    
    void Awake()
    {
        audioSource = GetComponent<AudioSource>();
    }
    
    public void Call(AudioClip audioClip)
    {
        audioSource.PlayOneShot(audioClip);
    }
}
```


## 終わりに
最後まで読んでいただきありがとうございました。読者の皆様がこの記事から何かしらのヒントや情報を得てくださり、少しでもお役に立てたなら幸いです。

今まで他の記事みてクソ長コード貼り付けられてたら不親切だなあと思ってたんですが、同じことを自分もやりかけてるというな。これは非常によくないことです。

## 参考資料
[【もう悩まない】初心者が押さえたいブログの書き方の基本18個](https://www.xserver.ne.jp/blog/how-to-write-blog-for-beginner/)
[Unity初心者がUnityでLive2Dモデルを動かすため環境構築をした](https://qiita.com/nori0__/items/988dcd7b038c838ca851)
[Unityゲーム開発記・アドバイスお願いします ～ゲームをリスタートできるようにする１～](https://qiita.com/Sat_Kat/items/99dd4d87875b3fb13c53)
追記予定