MIXAMOで3DモデルにアニメーションつけてUnityで制御するまでやってみる

Mixamoでアニメーションを設定して、Unity で制御するまでやってみます

## Mixamo にアップロード
https://www.mixamo.com
_※Adobe CC のアカウントが必要です_

まずは何かしらの人型モデルデータを用意。サイト上でリグを設定することもできます（モデルによってはうまくいかない場合もある）。
データ形式は、FBX、OBJ、ZIP に対応しています。ちなみに zip というのはテクスチャとマテリアル、obj を固めたもの。

![mixamo-upload.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/60964870-ff97-a464-2129-32779eb9bd49.jpeg)
_UPLOAD CHARACTER からアップロード_

## マーカーを設定する
右側のサンプル通りにマーカーを配置します。リギング済みのデータならこのステップは飛ばされます。

![mixamo-rigging.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/cc45bf47-dcd7-ff00-bb5e-a4b35e22e733.jpeg)
_Aポーズだと失敗しがちな気がしますが気のせいかもしれません_

## アニメーションを設定する
サイト内にアニメーションはいろいろありますが、今回は待機と歩行、ジャンプを設定。それぞれダウンロードします。
![mixamo-animation.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/0101c4ff-c333-8b5d-24df-d9fce4a30683.jpeg)
_座標が変わると困る場合は"In Place"にチェックを入れる_

Mixamo 上では複数のアニメーションをまとめることはできませんが、"Pack"で検索するとひとつのタイムラインにまとまったやつがいくつか見つかります。

## ダウンロードする
Unity形式でダウンロード
![mixamo-download.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/f5b27ed9-38c6-f50b-1454-1c8aa60ab4ce.jpeg)

## Unityにインポート
ダウンロードした FBX をUnityにインポート。Prefabになっているモデルの一体をヒエラルキーに配置して、新規の AnimationController をアタッチ。

![unity-import.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/5cfc5f21-11be-5003-0992-a9aaa70d2ca4.jpeg)

## Humanoid にする
単に動かすだけなら不要ですが、これをやっておくと、Humanoid形式の他モデルとAnimationControllerを共有できるようになるので便利。

![unity-humanoid.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/bfca13f8-2849-b2d2-77ae-e5e5a995e122.jpeg)

それと待機や歩行などはループにしておきます。AnimationController上のアニメーションクリップのインスペクタ→"Loop Time"にチェックいれるとループになります。

## アニメーションパラメーターをつくる
今回は 待機<->歩行<->ジャンプ という感じの制御なので以下のパラメーターを用意。

* Trigger 型で、名前を Jump
* Bool 型で、名前を IsWalk

![unity-param.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/b529bd2f-e051-4021-443c-a90cf707a2dd.jpeg)

## トランジションと条件を設定する
Prefab下にアニメーションクリップを AnimationController に配置して、それぞれをトランジションで結び、インスペクタを設定します。

__待機（Idle）→歩行（Walking）__
* "Has Exit Time"を__オフ__
* "Condition"を __IsWalk：true__ にする
![unity-transition-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/4a0e7664-f2f4-1467-8649-ccccb97194ec.jpeg)

__歩行（Walking）→待機（Idle）__
* "Has Exit Time"を__オフ__
* "Condition"を __IsWalk：false__ にする
![unity-transition-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/e1c1b28c-b539-d60d-b414-ed6d7c355216.jpeg)

__待機（Idle）→ジャンプ（Jumping）__
* "Has Exit Time"を__オフ__
* "Condition"を __Jump__ にする
![unity-transition-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/2d8c3fd3-aac1-3c0c-02c1-b3fa9753a1da.jpeg)

__ジャンプ（Jumping）→待機（Idle）__
* "Has Exit Time"を__オン__
* "Condition"を __IsWalk：false__ にする
![unity-transition-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/58466929-820b-5176-355d-d719d5d25ea5.jpeg)

__歩行（Walking）→ジャンプ（Jumping）__
* "Has Exit Time"を__オフ__
* "Condition"を __Jump__ にする
![unity-transition-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/01a42f8c-6423-6471-7448-981bcb42ee5b.jpeg)

__ジャンプ（Jumping）→歩行（Walking）__
* "Has Exit Time"を__オン__
* "Condition"を __IsWalk：true__ にする
![unity-transition-6.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/83826d0b-b18d-4598-c9dd-c0b23f5da627.jpeg)

アニメーションに間がついてたりして違和感あったら、クリップのIn点とOut点を調整したり、アニメーションブレンドしたりすると良い感じになります。

## 制御スクリプトをつける

ごく簡単な制御をしてみます。以下のスクリプトをヒエラルキー上のモデルにアタッチすると、上アローキー押下で待機から歩行、キーを離すと歩行から待機、スペースキーでジャンプします。

```csharp:Anim.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Anim : MonoBehaviour
{
    private Animator anim;

    void Start()
    {
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.UpArrow))
        {
            anim.SetBool("IsWalk", true);
        }
        else
        {
            anim.SetBool("IsWalk", false);
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            anim.SetTrigger("Jump");
        }
    }
}
```

![unity-playing.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/d65d9032-db02-1c90-5fee-57171dd5761c.jpeg)