Live2DのモーションをMecanim制御する

Live2DモデルのモーションをMecanimで管理できないかな～って考えてたら、簡単なやり方を思いついたので試してみました。
まずはLive2D Unity SDKのMotionプロジェクトを開きます。
（sample\Motion\Assets\Scene\Sample.unity）

このプロジェクトはモーションを1つ再生するだけのシンプルなものです。

##Live2DモデルをMecanimで制御する手順
１）まずはLive2DModelにAnimatorを追加します
![01.png](https://qiita-image-store.s3.amazonaws.com/0/15028/19ef4104-136f-3bd8-6efb-5e2db5ba2834.png)

２）[Assets]-[Create]からAnimator Controllerを作成し、Live2DModelにアタッチします
![02.png](https://qiita-image-store.s3.amazonaws.com/0/15028/0f6d28d8-c94e-9a9d-baa9-344ee87b26ea.png)

３）HirarchyでLive2DModelを選択した状態で、[Window]-[Animation]を開き[Create New Clip]で新規Animationを作ります
![03.png](https://qiita-image-store.s3.amazonaws.com/0/15028/9db6b127-bfb2-d479-8f45-0d1d77fcb35e.png)

４）Add Curveボタン押下し、Motion Fileの＋ボタン押下します
![04.png](https://qiita-image-store.s3.amazonaws.com/0/15028/a362a1ce-d40b-ba33-a690-8abaceb9f83f.png)

５）1:00のキーフレームはDeleteし、0:00の方を選択し、InspectorのMotion Fileを指定します
![05.png](https://qiita-image-store.s3.amazonaws.com/0/15028/b967abf3-5f2a-2c70-14e3-ce9101800f96.png)

![06.png](https://qiita-image-store.s3.amazonaws.com/0/15028/e249c02c-10f5-1a25-2458-ed9a0983e2e9.png)


**要するに（３）～（５）を繰り返して、Motion File名を変えて上げればＯＫ！
モーションファイルはサンプルモデルとかから持ってきて下さい。**

６）Animatorの方にAnimationをドラッグ＆ドロップします。
![08.png](https://qiita-image-store.s3.amazonaws.com/0/15028/bb0dff45-86b9-aa1c-9707-131bea986e75.png)

７）MakeTranstionでつないでパラメータを作ります
![09.png](https://qiita-image-store.s3.amazonaws.com/0/15028/26205f75-6f06-6950-b7bc-6bc7473d6258.png)


８）あとはソースをちょっと直せばMecanimで管理できます！

```csharp:SimpleModel.cs
using UnityEngine;
using System;
using System.IO;
using System.Collections;
using live2d;

[ExecuteInEditMode]
public class SimpleModel : MonoBehaviour
{
    private Live2DModelUnity live2DModel;
    private Live2DMotion motion;
    private MotionQueueManager motionMgr;

    private Matrix4x4 live2DCanvasPos;

    public TextAsset mocFile;
    public Texture2D[] textureFiles;
    public TextAsset motionFile;

    private Animator anim;            // Animator
    private int mtnnum = 0;           // モーション番号
    private bool changeflg = false;   // モーションチェンジフラグ


    void Start()
    {
        Live2D.init();
        // Animatorを取得
        anim = GetComponent<Animator>();


        live2DModel = Live2DModelUnity.loadModel(mocFile.bytes);

        for (int i = 0; i < textureFiles.Length; i++)
        {
          live2DModel.setTexture(i, textureFiles[i]);
        }

        float modelWidth = live2DModel.getCanvasWidth();
        live2DCanvasPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50.0f, 50.0f);

        motionMgr = new MotionQueueManager();
  }


  void OnRenderObject()
  {
        if (live2DModel == null) return;
        live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);

        if (!Application.isPlaying)
        {
          live2DModel.update();
          live2DModel.draw();
          return;
        }

        // 現在のフラグ値とMecanimのフラグ値を比較
        if (mtnnum != anim.GetInteger("Motion"))
        {
          // Mecanimからフラグ値取得
          mtnnum = anim.GetInteger("Motion");
          // モーションを読み直す
          motion = Live2DMotion.loadMotion(motionFile.bytes);
          // フラグをONにする
          changeflg = true;
        }

        // モーションが終了していたら or フラグが更新されていたら
        if (motionMgr.isFinished() || changeflg == true)
        {
          motionMgr.startMotion(motion);

          // フラグをOFFにする
          changeflg = false;
        }

        motionMgr.updateParam(live2DModel);

        live2DModel.update();
        live2DModel.draw();
        }
}
```

これで簡単にMecanim制御できました！
![2015-03-02_13h59_41.png](https://qiita-image-store.s3.amazonaws.com/0/15028/a5e882f2-851b-f303-17af-371037419ea0.png)

たぶん、音声やLive2DのモデルファイルもPublicにしとけばMecanimで管理できるかと思います

2015/05/11追記
・モーション切り替えがスパッと切り替わらないバグあったので、修正版書きました
[Live2DモーションをStateMachineBehaviours制御する](http://qiita.com/naotaro0123/items/b5f9ee0acb54ad04f51b)