【勉強会】第1回 横浜へなちょこUnity勉強会①〜プレゼン

今月もはるばる行って来ました横浜。
http://atnd.org/events/20574

前回の第0回は書籍「Unity入門」の読書会という趣旨だったのですが、今回からは特にお題は決めず、各自が発表やその場で勉強をするスタイル。

僕の今回の目的、というか自分に課したお題は「自分で作ったデータをUnityで動かす」です。「Unity入門」のChapter6のサンプルのような、スキンキャラクターを用いたアクションゲームが作りたいなと。そのテスト。
http://homepage3.nifty.com/ika-aki/CoinCrazy/WebPlayer/WebPlayer.html

  • -

今回、第1部としては主催者と参加者からそれぞれ1つずつプレゼンがありました。
※がっつりプログラムの内容なので細かい内容はよく分かりませんが、ピンポイントで我社のプログラマに見せたいので、その際のメモをのっけときます。Twitterハッシュタグ「#yhunity」でまとめて見れますので、そちらも参照して下さい。

http://twitter.com/#!/search?q=%23yhunity

最初のプレゼンは主催者の@fum1h1roより。主に、Unityにおけるコードの再利用について。

  • -

敵の動きをスクリプトで書く場合、全敵のスクリプトを描くのはつらい。解決策としては・・・

①コピペ

敵少なけりゃいいけど数百とかいたらダメでしょ

②クラス継承

javascriptの場合・・・クラス定義どこにあるの?
→独自の継承の余地が無い。
→UnityのはJavaScriptではない。似てるだけ

C#の場合・・・
→独自にクラス作って敵に継承できた。
C#は通常C#に近い。制限は名前空間の使用禁止くらい

③クラスコンポジション

別のクラスからメンバとして呼び出せる。
→この方法がいい?

Unityはオブジェクトに対してコンポーネントを追加していくタイプ。


まとめ

・ゲーム制作では継承が敵作成(同じような処理だけどちょっと異なる処理)に有効
GUIでも使い出がありそう。

・Unityのスクリプトは、別のスクリプトと合わせて使用することが出来る。
→パフォーマンスを上げるにはC#
JavaScriptC#の混在でOK。

  • -

以上、わからないなりにメモってた内容なので、間違いあればご指摘下さい。


これらのコードの再利用については、「Unity入門」でも、最近発売されたUnity本「Unityではじめるゲームづくり」(既に先行販売中)でもあまり触れられていない部分だとのこと。その点、有意義なプレゼンだったのではないでしょうか。

Unityではじめるゲームづくり (ゲープロシリーズ)

Unityではじめるゲームづくり (ゲープロシリーズ)


2つめのプレゼンは「Pythonゲームプログラミング入門」の翻訳をされた@shinriyoさんからのプレゼン。(←2011/11/12 ご指摘により修正しました!)

「Unity Programing in Boo」と題して、スクリプト言語「Boo」のUnityでの使用についてお話し頂きました。後ほどどこかにスライドをアップして頂けるとのことなので、詳しい内容はそちらから見て頂ければと思います。

※2011/11/12追記!スライドをアップしていただきました!
http://www.slideshare.net/ShinsukeSugita/unity-programing-on-boo-10045689

Pythonゲームプログラミング入門

Pythonゲームプログラミング入門

以下、簡単なメモ。

・Boo=Pythonもどき
→インデントが文法
→リスト内包表記もOK
→直接Vector3の値へ代入OK。

・日本で使ってる人はまず見かけない。
→海外だと、Boo使われてる(作者はブラジルの人)
→今後増えてく?そうでもない。
→作者がUnityで働いてるらしいので、今後サポートはされるだろう。

・Booの本が無い。どう学べばいいのか?

  • -

プレゼンの最後に「今後Unityでどのコードを使うか?」というアンケートが取られたのですが、

JavaScript・・・やや少なめ
C#・・・過半数
・Boo・・・1名

と、以外にC#の人が多かったです。


この後は、各自あるいは数人でまとまって勉強、となり、僕は前述のように「自作キャラクターを動かす」ための勉強をしてたのですが、内容がプレゼンと全く別になるため、次の記事に回します。

    • -

【勉強会】第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では最適解だと思うのだけど…。



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

  • -

【勉強会】第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に読み込むことが出来ました。
次はこのデータをサンプルゲームに組み込んで、動かしてみたいと思います。

  • -