tuedaの日記

2012-01-06

[][] BlenderからUnityへキャラクターをインポートする

Unityにモデリング機能は当然無いので何らかのモデリングソフトでキャラクターを作ってUnityにインポートする必要がある。

フリーで最強はBlenderだろう。プロでも十分使える(というか元々はプロ用のプロプライエタリなソフト)高機能なモデリングソフトだ。

その分初心者には使いにくかったりするが...かくいう私も2.49まではUI生理的に受け付けずメタセコイアやMilkShape3Dを使っていたり。

2.5.xになって大分使いやすくなった。というわけでレッツトライ。

良くないエクスポート

適当にロボットを作ってFBX形式でエクスポートする。

ファイル形式は他にもいろいろあるがいろいろドキュメントを読んでいるとFBXが標準っぽい。

モデルはこんな感じ。

f:id:tueda_wolf:20120106144242p:image:medium f:id:tueda_wolf:20120106144244p:image:medium

FBXのエクスポート。デフォルトではカメラやライトを含めてシーン全体をエクスポートするので、

「Selected Objects」にチェックを入れて選択したオブジェクトだけエクスポートする。

アニメーションやモディファイヤーはOFFで。


インポート

Projectビューを右クリックして「Import New Assets」からインポート。

プリファブなのでシーンにドラッグ&ドロップしてGameObjectとして追加。

なぜかすごく小さかったのでスケールで100倍にしてめでたく表示された(左図)。。。が、これは非常に良くない!

f:id:tueda_wolf:20120106144836j:image:medium f:id:tueda_wolf:20120106144837j:image:medium(右:参考)

右図は標準のCupsuleだが+Y軸が上、+Z軸が前になっている。左図のロボットは全然これと異なっている。

キャラクターを操作するときはデフォルトで「前」が「+Z方向」でないと困る。

(常にオフセット行列をかける手もあるが、絶対に途中で死ねる)

Unityは左手座標系で何もいじらない状態で上が+Y軸、キャラクターや弾丸は+Z方向を向いているのが望ましい。

FBXエクスポート

何が原因かというとBlenderは右手座標系で上がZ軸でありUnityと全然違うのが問題。

Blenderの座標系をUnityにあわせて変更。。。。はできないので、エクスポートするときに変更する。

これはどの形式でもわりと一般的。どのエクスポーターでも「Y軸とZ軸を交換する」みたいオプションが必ずある。

BlenderのFBXエクスポーターには

Forward: -Z Forward 
Up: Y Up

という項目があってどうやらこれっぽい。

、のだがこれの意味するところがさっぱりわからん!

ぐぐっても使用している人はいなさそうだし項目自体何を言っているのか意味不明。

しょうがないから自分でいろいろ変更して出力してみたが、確かに変わることは変わるが、

どういうルールが適応されているのかさっぱり分からん!

なるほど誰も使わないわけだ。これは実用的ではない。

Unityフレンドリーなエクスポート

というわけでエクスポーターで調整するのはあきらめて、オブジェクトそのものをUnityにあわせて予め回転させておく。

ポイントは(1)+Y軸方向が上(2)+Z軸方向が前の2つである。X軸周りに-90℃でOK

回転させたら忘れずに忘れずに回転を座標に焼き込んでおく(オブジェクトモードで左下の「Object」ー「Apply」−「Rotation&Scale」)。

単に回転しただけだと変換行列が変わっただけでローカル座標の値は何も変わっていないので(これ重要)。

右のパネルの「Transform」の項目の「Rotation」と「Scale」が(0,0,0)と(1,1,1)になっているように。

f:id:tueda_wolf:20120106144242p:image:mediumf:id:tueda_wolf:20120106144243p:image:medium

FBXエクスポートはデフォルトのままでいい。

(右手と左手の違いによる反転が必要だがZはデフォルト(Forward: -Z Forward)で反転している)

Unityにインポートした直後は「Rotation」に変な値(確か(270,0,0)だったと思う)が入っているので、

全部0にする(0,0,0)ときちんと表示された。

f:id:tueda_wolf:20120106144840j:image:medium f:id:tueda_wolf:20120106144837j:image:medium(右は参考画像)


コリジョンの設定のTIPS

「Character Controller」をセットすると自動でコリジョンの形状をセットしてくれるが、

これの中心はBlenerのオブジェクトの「オリジン」と同じ。

従ってオリジンがとんでもないところにあると、とんでもないコリジョンを設定してくれて、多分期待したとおりには動かない。

f:id:tueda_wolf:20120106144841j:image:medium

Blenderでは左の「Object Tools」パネルの「Origin」−「Origin to Geometry」でオブジェクト中心にセットできる。

[] Unityでシーン遷移を作る。ついでにGUI

市販のゲームだと「オープニング画面」「タイトル画面」「ゲーム画面」「コンフィグ画面」「おまけ」とか、いくつかのシーンを移動することが多い。

もちろんUnityで作るゲームもそういう作りになる。

というわけで試してみた。

ProjectビューでSceneディレクトリを掘ってから「File」-「New Scene」で新規のシーンを追加。

この時付けたフィル名("TitleScene")が、後でこのシーンを参照するときの名前になる。

さらに作ったシーンを「File」-「Build Settings」でビルドに追加する。

これをやらないとシーンをApplication.LoadLevel()でロードできない。

ちなみにLoadLevel()でロードすると古い方のシーンは破壊される。

(コンフィグ画面とか以前の状態に戻りたいときはどうすれば???)


そして何となく作ってみたゲームの初期画面風。

画像は拾いもの。すみません作者がわかりません。

f:id:tueda_wolf:20120106210352j:image:w360

f:id:tueda_wolf:20120106210353j:image:w360

日本語が化けるような話も聞いたが、特に何もしなくても問題が出なかった。

あとα抜きもきちんと出来ている。

スキンによるカスタム方法は省略。