【勉強会】第1回 横浜へなちょこUnity勉強会③〜FBXに複数のアニメーションを持たせる〜とりあえず解決編

http://atnd.org/events/20574

また前回の記事の続きです。複数のアニメーションを持ったFBXファイルをどうやってUnityに読み込むか?


4.複数のアニメーションを持ったFBXを作成する方法(解決編)

  • -

その後、「FBX」「複数持たせる」「アニメーション」などで検索していくと、一つのヒントが見つかりました。こちらのページです。

■複数アニメーション対応FBXの出力
http://www.kosaka-lab.com/tips/2010/01/fbx.php


おおこれはまさに望みの内容!!と思ったのですが…かなりトリッキーな方法ではあります。引用させて頂きますので、御覧ください。

(以下、引用)

MayaからFBXにアニメーションを出力した場合、1つのFBXファイルに対して1つのアニメーションしか出力されません。一つのFBXファイルに複数のアニメーション(歩く、座る、など)を格納する方法を発見しました。

MayaからFBXに出力する時にバイナリではなくテキストモードで出力します。
そして、動作毎に、一つずつファイルを出力します。3つのモーションが欲しければ3つファイル出力します。このとき、モデルのデータに変更を加えないようにしてください。

 どれか一つのファイルをメインとして、そのファイルにアニメーションデータを追加していきます。
メモ帳や秀丸などのテキストエディタでFBXファイルを開きます。

ファイルの後方辺りに、アニメーションデータが格納されています。

;Takes and animation section
;----------------------------------------------------

Takes: {
Current: "Take 001"
Take: "Take 001" {
FileName: "Take_001.tak"

・・・・略・・・・
}
}
 Currentの行とTake : "Take 001" { ・・・・}の間が、一つのモーションとなります。
なので、他のファイルから取得した同じ部分をTakes{ ・・・・} に貼りつけます。
識別しやすいように任意の名前をつけてください。

;Takes and animation section
;----------------------------------------------------

Takes: {
Current: "Take 001"
Take: "Take 001" {
FileName: "Take_001.tak"

・・・・略・・・・
}


Current: "Take 002"
Take: "Take 002" {
FileName: "Take_002.tak"

・・・・略・・・・
}

Current: "Take 003"
Take: "Take 003" {
FileName: "Take_003.tak"

・・・・略・・・・
}

}
 これで、1つのファイルに複数のアニメーションを格納することができます。同じような方法でXファイルにも複数のアニメーションを格納することができます。

(以上、引用終わり)


ポイントとしては、

・maya(maxでもOK)から、テキスト形式(ASCII)でFBXをアニメーションごとに出力。
・各FBXのアニメーション情報部分を、1つのFBXに追記して保存する。

ということになります。早速試してみます。



maxからFBXで書きだす際に、「拡張オプション」の「FBXファイル形式」でバイナリではなくASCIIを選択。

で、テキストエディタで開いてみると…

あれ?先に紹介したサイトのFBXの中身とちょっと違います。「Takes and animation section」になってるはずのところが「Takes section」になっていて、しかもアニメーション情報の中身がありません。どうやら、これはFBXのバージョン違いによって起こる問題のようで、最新のFBX2012、また2011でも、同様の形式で書き出されてしまうようです。

ここでの対処法は、書き出し時のオプションで「FBX2010」を選択すればOKのようです。


この方法で、複数のFBXを書き出します。ここでは、「boy_idle」「boy_walk」の2つのFBXを書き出しました。


次に、1つメインのFBXを決めて、そこに他のFBXからのアニメーション情報のテキストのみをコピペします。スキンキャラクターのFBXとなると非常に長いテキストファイルになるのでちょっとわかりにくいのですが…


ここから


ここまで

をコピーして、


ここにペーストしました。アニメーションの名前が「Take 001」のままだと重複してしまうので、「Take 002」など、別の任意の名前に変えておきます。「Idle」「Walk」などわかりやすい名前にしておいたほうが良いでしょう。

テキストの編集が完了したら、ファイルを保存し、Unityにドラッグ&ドロップしてみます。すると・・・


1つのモデルに2つのアニメーションを持ったFBXが読み込めました!!



<追記>

  • -

これは勉強会の後、(つい先程)試したのですが、
Projectビュー内でのドラッグ&ドロップではなく、Hierarchyビューで「boy_idle」を選択

Inspectorビュー内の「Animation」→「Size」をデフォルトの「1」から「2」に変更。すると「Animation」の項目に「Element 1 Take 001」が追加されます。「Element 0」には、Tale 001(idleのアニメーション)が最初から入っています。

Projectビューの「boy_walk」ツリー内の「Take 001」を、「Element 1」の「Take 001」にドラッグ&ドロップします。名前が同じなのでわかりにくいですが、こちらの「Take 001」は、歩きのアニメーションです。

Inspectorビューの「Animation」の一番右にある○マークを押すと、再生するアニメーションを選択することが出来ます。これまた同じ名前「Take 001」で分かりづらいのですが…。

この方法で、Unity上で1つのモデルに複数のアニメーションを持たせることが出来ます。ただし、この方法では結局同一のモデルを複数読み込むことになりますので、ビルドした際のデータ量がどうなるのか(僕にはよくわかりませんが)、心配な所ではあります。試しにアニメーションのコピー元である「boy_walk」を削除すると、コピー先のアニメーションも消えてしまいました。結局、別モデルのアニメーションを参照しているだけなんですね。これで出来無くは無いけれど…決してベストとは言えない方法です。

  • -

5.まとめ

  • -

…目的は達成したものの、最初に述べたようにちょっとトリッキーな手法です。出来れば、maya、maxから直接複数アニメーションを書き出せないか、またはUnity上で複数アニメーションをジオメトリ1つに対して設定できないか、さらに検証したいところです。
例えば、ジオメトリを持たないFBXって書き出せないのかなあ…と思うのだけど、max、mayaのエクスポーターからは、必ずジオメトリ込みで書き出す必要があります。試しに骨のみで書き出したFBXをジオメトリ付きのFBXに適用してみたところ、

こんなふうに横向きになっちゃいました。(ジオメトリがあればよいってことは、何かダミーのモデルと合わせてエクスポートすればいいのかもしれない。後で試してみます。)

後、帰りの電車で勉強会参加者の一人に聞いた情報で、「Cheetah3dチータ3D)」というソフトを使ったらどうか?みたいなお話しがあったのですが、これは初めて聞きました。ソフトの存在も含めて。
http://ja.wikipedia.org/wiki/Cheetah3D
http://www.cheetah3d.com/


今後も検証は続けるとして、ひとまず自前のキャラクターをUnityに読み込むことが出来ました。
次はこのデータをサンプルゲームに組み込んで、動かしてみたいと思います。

  • -