【勉強会】第1回 横浜へなちょこUnity勉強会②〜FBXに複数のアニメーションを持たせる。

前の記事の続きです。

http://atnd.org/events/20574

勉強会後半戦は、個人でそれぞれの課題に取り組むような感じ。僕はひととおり「Unity入門」の内容は(触りだけとは言え)終わってるので、次は自作のキャラクターを動かしたい!ということで、まずは3DソフトからUnityにアニメーション付きのモデルを持ってくることにしました。(この1ヶ月の間にホントはやっときたかったんだけどね…)

1.3DソフトからのFBXエクスポート

  • -

Unityコミュニティ内での標準ツールとしてはmayaを使用しているっぽいのですが、今回はアニメーションで使い慣れてるmaxを使用。サンプルキャラクターは、学校のローポリモデリング、アニメーションの授業で使用しているものです。(仮に「Boy」としましょう)

テクスチャが仮なので、まだ顔が描いてありません。ちょっと怖い。


Unityは.mbや.maxのデータを直接読むことも出来るらしいのですが、ひとまずそのへんの検証は後回しにして、3Dデータ交換形式の標準でもある「FBX」を使用します。最近、仕事でFBXを扱うこともあったので、FBXへの書き出し自体は特に問題になることはあリませんでした。


ファイル→書き出し

FBX形式を選択し、任意の名前をつける(ここでは「boy」にしました)

FBXエクスポートのオプションウィンドウで標準プリセットの「Autodesk Media&Entertainment」を選択してOKを押します。

  • -


2.UnityへのFBXインポート

  • -

次にUnityへのFBXインポートですが、これも特に問題無く出来ると思います。「Unity入門」Chapter6の内容を参考にすればOK。


先ほど作成した「boy.fbx」をUnityのProjectビューにドラッグ&ドロップし、さらにProjectビュー内の「boy」をHierarchyビューにドロップしてプレハブ化すれば、Sceneビュー、Gameビューにキャラクターが表示されます。(テクスチャは別途読み込む必要あり)

Playボタンを押せば、アニメーションが再生されます。


ここで注意すべき点としては、maya、maxなどの3Dソフトであまりに小さすぎる、または大きすぎるキャラクターを作成した場合には、各ソフトでのFBXの書き出し時、もしくはUnityでの読み込み時に単位設定を調整する必要があります。今回のmaxのデータの場合、キャラクターを実寸で身長150cmくらいに作っておいたのですが、Unity単位ではおそらく1.5として読み込まれています。(Unityの単位の扱いはメートルを基準にしているっぽい)

max側でスケールを調整するには、FBXのエクスポートで「拡張オプション」→「単位」の項目で「自動」のチェックを外し、任意の単位を設定します。

ちなみに、標準のセンチメートルからミリメートルに変更してFBXを書き出すと、Unity上でのサイズは10倍になります。
※Unity向けに限った話では無いのですが、基本的にmayaでもmaxでも実寸を基準に作成していれば大きな問題は起きにくいかと思います。

Unity側でサイズ変更をする場合は、Projectビューでモデル(boy)を選択した状態で、Inspectorビューの「FBX Importor」→「Scale Factor」の値を変更します。


Scale Factor = 0.01(デフォルトの場合)


Scale Factor = 0.001に変更すると、サイズが1/10になる。

おそらく、この数値は1mを基準にして0.01ならcm、0.001ならmm単位で読み込まれるみたいだね。
ちなみに一番下の「Apply」ボタンを押さないと、変更が反映されないのでこれも注意!(けっこう知らないとはまります)


もう一つの注意点として、これはUnity入門にも書いてあるのですが、標準で読み込んだ場合には、アニメーションがループ再生されません。

これは、Inspectorビューの「FBX Importor」→「Animation」領域内の「Animation Wrap Mode」をデフォルト値「Default」から「Loop」に変更し、「Apply」ボタンを押せば、ループ再生されるようになります。



3.複数のアニメーションを持ったFBXのエクスポート

  • -

さて、ここからが問題です。Unity入門のChapter6では、サンプルのFBXが複数のアニメーションを持っています。

Idle、Walk、Jump、Crouchの4つのアニメーションを持っているのが分かると思います。


先ほどmaxから書き出したboy.fbxのアニメーションを見てみると、

「Take 001」という1つのアニメーションしか持っていないことが分かります。
(アニメーションの名前も、FBX書き出し時に自動的に上記に名前になるようです)

まあこれは当然で、そもそも mayaも maxも、1つのシーン内、1つのタイムライン上に複数のアニメーションを持つことはできません。
(アニメーションレイヤーという機能はあります。まだ試してはいないのですが…これは本来、複数のアニメーションを持たせるための機能ではありません。要検証。)


試しに、Unity入門のサンプルFBXをmaxに読み込んでみると…

確かに、FBXが複数のアニメーションを持ってる!…のですが、ここから1つだけを選択して読み込むことしか出来ません。
やはり、3Dツール上で複数のアニメーションを持つことはできないようです。


ひとまず、maxでboyに「idle」と「walk」の2つのアニメーションをそれぞれ別ファイルで作り、別のFBXとして書きだしてみました。


boy_idle.fbx


boy_walk.fbx(適当に作ったら、手足が同時に出ちゃってる…)


んで、これを同じUnityプロジェクトにドロップして、Unity内でアニメーションを複数もたせられないか…と思ったんだけど

やっぱり、個別のモデルにに個別のアニメーションとしてしか読み込まれないし、Projectビュー内でドラッグして別のモデルにアニメーションだけ紐付け出来るんじゃないかと思って試したけど、ダメですね。(何か方法はあるのかもしれないけど…)


ん〜こりゃどうしたもんか。
後で勉強会の主催者に聞いてみたら、前の記事で紹介したUnity本「Unityではじめるゲームづくり」では、複数のアニメーションを並列で持つ方法ではなく、タイムライン上に異なるアニメーションを直列に並べて、プログラム側でトリミングして使用している、とのこと。まあ、確かにこういう方法取る場合もあるけど、データ作り自体をそういうふうにする必要があるし、プログラム側でも処理がめんどいよな〜。やっぱり複数のアニメーションを持つ方法が、Unityでは最適解だと思うのだけど…。



また長くなったので、解決編は次の記事に。

  • -