Unity
Mixamo

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

More than 1 year has passed since last update.

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


Mixamo にアップロード

https://www.mixamo.com

※Adobe CC のアカウントが必要です

まずは何かしらの人型モデルデータを用意。サイト上でリグを設定することもできます(モデルによってはうまくいかない場合もある)。

データ形式は、FBX、OBJ、ZIP に対応しています。ちなみに zip というのはテクスチャとマテリアル、obj を固めたもの。

mixamo-upload.jpg

UPLOAD CHARACTER からアップロード


マーカーを設定する

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

mixamo-rigging.jpg

Aポーズだと失敗しがちな気がしますが気のせいかもしれません


アニメーションを設定する

サイト内にアニメーションはいろいろありますが、今回は待機と歩行、ジャンプを設定。それぞれダウンロードします。

mixamo-animation.jpg

座標が変わると困る場合は"In Place"にチェックを入れる

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


ダウンロードする

Unity形式でダウンロード

mixamo-download.jpg


Unityにインポート

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

unity-import.jpg


Humanoid にする

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

unity-humanoid.jpg

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


アニメーションパラメーターをつくる

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


  • Trigger 型で、名前を Jump

  • Bool 型で、名前を IsWalk

unity-param.jpg


トランジションと条件を設定する

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

待機(Idle)→歩行(Walking)

* "Has Exit Time"をオフ

* "Condition"を IsWalk:true にする

unity-transition-1.jpg

歩行(Walking)→待機(Idle)

* "Has Exit Time"をオフ

* "Condition"を IsWalk:false にする

unity-transition-2.jpg

待機(Idle)→ジャンプ(Jumping)

* "Has Exit Time"をオフ

* "Condition"を Jump にする

unity-transition-3.jpg

ジャンプ(Jumping)→待機(Idle)

* "Has Exit Time"をオン

* "Condition"を IsWalk:false にする

unity-transition-4.jpg

歩行(Walking)→ジャンプ(Jumping)

* "Has Exit Time"をオフ

* "Condition"を Jump にする

unity-transition-5.jpg

ジャンプ(Jumping)→歩行(Walking)

* "Has Exit Time"をオン

* "Condition"を IsWalk:true にする

unity-transition-6.jpg

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


制御スクリプトをつける

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


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