Help us understand the problem. What is going on with this article?

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

nenjiru
Creative Technologist https://twitter.com/nenjiru http://www.slideshare.net/minorunakanou
http://nenji.ru
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away