Mecanimで3Dモデルにアニメーションをつける

前に作ったゲームの手直しをするぞと宣言したけれど、結局新しい技術に手を出してしまう罠。まあ予想通りですw
 

メカニムに手を出してみる

Unityには「メカニム(Mecanim)」という機能があります。これは一言で言うと、びっくりするほど簡単に3Dモデルにアニメーションをつけることができるという、画期的な新機能らしいです。
http://docs-jp.unity3d.com/Documentation/Manual/Mecanim%20Animation%20System.html
普通だったらそれこそクレイアニメを撮るように、ちょっとずつ動かして一コマ一コマ繋げていってようやく出来上がるものなのですが、このメカニムという機能を使うと、他のキャラクター用に設定されているアニメーションを、手軽に違うキャラクターに違和感がないように適応することができるのです。
 

そして壁にぶち当たる

ところが、簡単なところにたどりつくまでのハードルがとてつもなく高かったのです。
-MM_tips9-
こちらのページを参考にサンプルデータにボーンをつけてUnityに読み込ませたのですが、ボーンもアンカーもそれとは認識されず、エラー出まくりで大変なことになっていました。
 

mixamoにアカウントを作る

もうゲームを作るのはやめて実家に帰ってトマトを作ろう、そう思いかけた時に救世主が現れました。
shade13.jp -&nbspshade13 リソースおよび情報
こちらはShadeというソフトでモデリングをしてUnityに取り込む方法を書いてあるページなのですが、そこで大変なホームページが紹介されていました。なんと、3Dデータをアップロードするだけで勝手にRIG(リグ、ボーンのこと)を設定してくれるというではありませんか。しかも無料!
3D Animation Online Services, 3D Characters, and Character Rigging - Mixamo 
これは試してみなければ、と、早速アカウントを登録し、さきほどのサンプルデータを読み込ませてみました。微調整をして2分ほど待つと完成です。ダウンロードの際に支払いの確認が出ますが、自分でアップロードしたデータについては無料みたいです*1
 

Unityに読み込ませる

喜び勇んでモデルをUnityに読み込ませましたが、肝心の動かし方がよくわかりません。公式サイトの説明を読んでも、アニメーションの付け方は書いてあってもキーボードの入力をどう受け取るのか、どう設定すれば受け取ってくれるかがわからず、悶々とした日々を続けていました。
その後も色々と調べていると、「Mecanim Demo Project」を試せばいいことがわかり、Asset Storeからダウンロードしてみました。付属のサンプルキャラクターを調べて、CharacterControllerが必要なことと、動作させるためのスクリプトの書き方がわかってきました。こうなると一気に進むのがUnityの楽しいところです。ハードルを乗り越えるとどんどん遊べてしまう!
 

こんな感じで書いてみました

C#初心者の自分が書いたもので見苦しいのですが、自分ぐらいのレベルの人も微レ存なのであげてみます。

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

protected Animator animator;

void Start ()
{
animator = GetComponent();
}

void Update ()
{
if(animator)
{

//前進。シフトを押すと走る。
float v = Input.GetAxis("Vertical");
if(Input.GetKeyDown(KeyCode.LeftShift)){
v=v*2;
}
animator.SetFloat("Speed", v);

//回転。止まってる時、歩いてる時、走ってる時でモーションを変えることができる。
float h = Input.GetAxis("Horizontal");
animator.SetFloat("Rotate", h);

//ジャンプ。歩いてる時、走ってる時でモーションを変えることができる。
if(Input.GetKeyDown(KeyCode.Space)){
animator.SetBool("Jump",true);
}
else{
animator.SetBool("Jump",false);
}

}
}
}

だいたいこれだけでヌルヌルと動いちゃうから素敵。この時代に生まれてよかった!
アニメーターには「SetFloat」や「SetBool」で値を送ることができます。受け取ったメカニムは、その時自分がどんなアニメーションをしているかを判断して、適切な動作を行うのです。ここに至ってようやく凄さがわかってきました。
 

ようやくメカニムの設定をする

f:id:Red-Comet:20130823003138j:plain
オレンジがアイドル状態。何もしていない時のアニメーションを割り当てます。
f:id:Red-Comet:20130823003447j:plain
さらに「Walk」「Run」のアニメを割り当て、矢印で結んだら、条件を設定します。例えば「Speed」の値が0.1以上になったら歩いて、それ以下になったら歩きなさいとか、”Jump”がTrueになったらジャンプしなさいとか。矢印通りにアニメーションは遷移するので、難しいプログラムを書く手間が相当省けるのだとわかりました。
例えば、止まっている時に左右を押すとその場で方向転換するのですが、走っているときはこんなふうに
f:id:Red-Comet:20130823003930j:plain
走りながら曲がるようにするのも先ほどの単純な中身で大丈夫なのです。これは凄い!
 

手順を整理

というわけでUnityでオリジナルモデルを動かすためには、次のような流れだと分かりました。

  1. メタセコイアでモデルを作る
  2. FBXで出力する
  3. Mixamoでオートリグを適用してダウンロードする
  4. Unityに読み込ませて、インスペクタから「Rig」「Humanoid」に設定してコンフィグして配置
  5. ゲームコントローラーを設定して、アニメーターに入力データを送るスクリプトを書く
  6. いい感じにMecanimを設定する

こう書くと大変そうだけど、手順がわかってしまえばもう簡単かな?
 

今後の課題

というわけで守られた試しのない(笑)今後の課題のお時間です。

オリジナルのモデルを作る

人の作ったデータで遊ぶのも楽しいのですが、やはりオリジナルのものを用意できるのが一番かな~と思っています。難しいボーンやアンカーの設定が不要で、メタセコイアで作ってFBX出力さえしてしまえばミキサモでUnityに対応できることがわかったので、明日から手がけてみます。

アニメーションを探す?作る?

サンプルのものだけだとやはりちょっと動きのバリエーションが乏しいのが気になります。フリーで探すか自分で作るか、とりあえず手持ちのでなにかゲームを作ってみるか、モデリングしながら決める予定。

プログラムを改良

いまのままだと多少ぎこちない部分があるので(走ったあとシフトキーを離しても歩かないとか)、もう少し詰めていきたい。

*1:10,000ポリゴン以上だと有料?