Unity2D Tilemap 準備編

Unity2D Experimental Preview Release 3の記事です。

Tilemapを使った何かを作りたいなーなんてのをずーっと考えていて、
Uniteで発表されたときから心待ちにしているのですが、ようやくEP3です。
アルファとかに早く正式実装してもらいたいところですね。
手探りしながらなんか作ってみようと思います。

タイルマップは、タイルとパレットという構成で実装されていまして、
タイルマップ系のツールを使ったことがある人には分かりやすいものかと思います。

まずはパレットを作りましょう。
パレットエディタを開くにはWindow→Tilemap Paletteです。

続いてAdd New Paletteを選びます。

名前と作るタイルの形状を設定したらOKを押します。
セーブするフォルダを聞いてくるので保存先を選択してください。

保存をしたら次はパレットにタイルを追加します。

タイルを作る方法はタイルオブジェクトだけを作る方法と、Spriteから作る方法があります。

まず前者の方ですがProjectのCreateメニューからTileを選ぶことで作れます。

この場合はタイルの情報のあれこれを自分で設定しなくてはいけないので、いささか面倒です。

後者の作り方はPaletteエディタへドラッグすることでSpriteから作成する方法です。
タイルの設定を自分で設定する必要もなく、MultipleのSpriteからは一気にタイルを登録されている分作成してくれます。
この場合は作成したTileをどこのフォルダに保存するか聞いてきますので、パレットの時と同様に対応してください。

パレットにタイルが登録できたら次は、ヒエラルキーの方へタイルマップを作成します。

一緒に子として作成されたLayerオブジェクトにTilemap Rendererが付いてますので、そこへタイルを登録していきます。

この時にタイルが置けなかったりした場合は、Tilemap Rendererのコンポーネントが張りついているオブジェクトを選択していないか、
もしくは、ここのロックがされていないかです。

ここのロックが外れているとパレットの編集モードになってタイルマップの方へ一切タイルを置くことができません。
(というかですね、このロックアイコン分かりづらいからUI変えて欲しいです)


ちょいちょいとやってこんな感じにタイルマップが作れます。
素晴らしいですなぁ。

次はソースコードから情報をどう触るか調べてみようと思います。

※マップチップはぴぽやさんのものを使わしてもらっています。

参照解決

<itemgroup>
   <projectreference Include="ProjectName.vcxproj">
     <project>{PROJECT GUID}</project>
     <referenceoutputassembly>false</referenceoutputassembly>
   </projectreference>
</itemgroup>

どうやら、参照が解決されないから、.vcxprojに追加してね(はぁと って、ことらしい。
コンバータだめすぎるだろうw

むーん。VisualStudio2010ばぐってるし-。

とりあえず、今日確認した症状。

出力ディレクトリと中間ディレクトリを設定する項目があるんだけど、出力にパスを設定して中間ディレクトリに$(OutDir)を設定する。
※$(OutDir)は出力ディレクトリのマクロ。
この順番で処理をするとずっと変更が反映されない。

出力→中間だった処理の順番が、中間→出力にかわったらしくて、出力を変えてもコマンドラインで確かめるとディレクトリに変化がない。
.vcxprjを開いて確かめたところ、VisualStudio2008のときからのタグがひっくりかえっていた。
またこれは2008からコンバートしたプロジェクトファイルでは発生していない。
2010で新規に作成した時に起きている。
UI的に上が出力、下が中間なんで、ここを変えられるときもいっつーか、変えないでw

ライブラリの依存関係のリンクがきちんとうごいてない。
「はい」に設定しても、ライブラリが追加されない。
結果、未解決でエラーになる。
なんで動かないかはわからないが、2つライブラリを追加しているのに、ひとつしか追加してくれない。

ライブラリ依存関係の入力を使用をぽちっても、片方のobjしか食ってくれない(コマンドラインで確認)
謎。

くそう、はかどらなかったー! ねるー!

シェーダー対応その後

シェーダーに対応したぜーというところまでは良かったのですが、固定機能を使っているところとの混在が面倒な感じだなーということで、その辺に手をいれることにした。
そうするかーってことなんだけど、とりあえず何から始めればいいのかよくわからないので、DrawIndexesPrimitiveを使うように変更することに。
ってことはーXファイルからその辺の情報を拾ってくることになるんだからーということでVertexBufferとIndexBufferを作るところから始める。
ものっすごい前にクラスを作ってから使われることがなかったものがようやく陽の目を見ることになりました! とかクラスライブラリを作ってる人にしかわからない話を交えつつぽちぽちと作ってみたら他にも色々なものが必要というのがわかってきまして、あれやこれややることになりました。

描画をするのにマテリアルの数でDrawSubsetしていたのですが、アトリビュートの数で描画をしなくちゃいけなくなるので、ID3DXMesh::GetAttributeTableなんてものを呼び出して拾おうとしたら、Optimizeしてからじゃないと拾えませんとヘルプに書いてあって、なんじゃそりゃーと思ったりしました。DrawSubsetは引数がアトリビュートIDなんだからきっとどっかでやってるんだろうし、勝手にやってくれればいいのにとかね。
贅沢な話でしょうかw

最終的に出ることは出たのですが、なんか色々とめんどうだなーとか思ったり思わなかったり。
IndexBufferを使わないでも描画するDrawメソッド用意しておかないと面倒そうです・・・。

シェーダー対応してた。

合間にAIONとかいう強敵もあったのですが、シェーダー対応してました。
とりあえずID3DXEffectを基本にしてつくってみたんですが、シェーダーに渡すのに名前で検索してハンドル経由だったり、使うテクニックも名前解決なんですよね。
まぁ、それはそれでいいのですが、シェーダーって渡すパラメーターがシェーダーによって違うんだけど、他の人はどうやって汎用性を持たせているのかなぁとかいうのが凄く疑問にのこったままです。
とりあえずシェーダーの設定をするコールバックを作って見たのだけど、なんかもっといい方法あるのかなぁ。とおもって調べて見たけど、もっと大規模なプロジェクトはもっと大変なことになるぜって話はあったんだけど、そんな規模のモノをつくってるわけじゃないんだよなーと・・・。

悩ましい。
まぁ、もうちょっとシェーダー自体の勉強をしてきますね。

でたでた

射影行列の前方クリップの値を0.0fにしていたんだけど、それがまずかったらしくて、1.0fにしたらきちんとでましたよっと。
うーん? 視錐台の前方クリップの位置がカメラから0距離になるだけだから問題ないような気がするんだけど・・・? とか悩んで図を見ながら0距離だと視野角もなくなるからダメなのかしらとかなんかいい加減な感じで納得しました。

よーわからん(ぉ

ようやく表示できた

ふーようやく表示できた(´Д`)

なんかバキバキ割れているのはなんだろう。
カリングとかっつーよりも、単純に.xに落としたときにデータがおかしくなっているだけな気がしないでもない。
テクスチャがモデルデータからの相対パスなんで、今は読み込むときに誤魔化したけど、真面目に作るとなるとちょっとパスの処理を入れなきゃいかんなーとか思いつつも、シェーダーも後回しにしているので、そのへんもやらんきゃいけないけど、とりあえず寝る!

モデルは、ntnyさん著「ローポリスーパーテクニック」から勝手に拝借したグレタ2Pカラーです。
暫くこのキャラをいじらせて貰おうかと思ってたりもします。

[amazon]4797347376[/amazon]

ライブラリの改良中

自前でゲームを作る時にこさえているライブラリを改良しているわけですが、今まで3Dのモデルを扱っていなかったので(3D平面のみ)、その辺を対応するかーとぽちぽち書き直しています。
ついでにシェーダーの勉強もしたいので、それへの対応もするかーというわけで、色々と機能追加なわけです。

3Dのモデル表示しよう

シェーダーも対応しよう

既存のレンダリング構造を改良

簡単なエフェクトクラスの作成

とりあえず.xファイルから表示しよう

.xファイルを読み込むところを作ろう

マテリアルとかのクラス追加( 今ココ! )

この後3Dモデルをどうたらこうたらとかあるわけですが、なんとも手間のかかる話です。
まぁ、3Dのモデルを出すのはただの自己満足にすぎないので、もっと必要なUVリストの作成ツールとか作らないとだめなんですけどね。
UVリストから自動的に2Dスプライトを作成すれば、デザイナ側からの変更も楽になるし、デザイナ側も大胆に配置変更しても平気だぜってことになるので・・・。
毎度苦労してるんだからさっさと作れとか言わないでくださいw

ガクブルしながら見積もってみた。

MSDNの有効期限が切れそうだから、おーぽんびじねすにして2年間コースにすることにした!

Visual Studio Professional w/MSDN Pro (J/E) SA Open Business
税込の合計:\125,082

た、たけぇぜ・・・ 個人で払い続けるには辛いものを感じるので売れる物を作りたい今日この頃です。

高い買い物で不安で仕方ないので、これでいいでしょうかとかメールしちゃったよ(笑)

doxygen-1.5.7.1

ひさびさに自分のライブラリのヘルプでも作ってみようかとdoxygenをDLしてきて、Doxyfileをぽちぽちと作ってみたら、あら途中で落ちましたよと。
なんだろかーとちょいちょいと調べてみたのですが、どうやら出力エンコード方法とか変えれるようですね。
なのでSHIFT-JISでえいやっとしてみたら、でることはでたんですが、Qt-Styleで書いているタグがどうにも美味くないようです。

\file テストファイル
\brief これはテスト用です

ってソースに書いたとしたら、\fileや\briefの部分がカットされずにそのままdoxygenの出力ファイルに混じってきてます。
なんでーとかおもいつつJavadoc形式にしてみたらきちんと消えます。
どうにも\の処理が美味しくないんでしょうかねぇ。

かといってソースをUTF8にするとかは、ちょっとまだ早いですしねぇ。
VCで開けるけどコードページを指定できないので、色々とうるさいことをいわれるし。

んーむとしらべてたら、どうやらSHIFT-JISではなくてCP932と指定すればいいよてきなことが書いてあったので、ほっほーとやってみたら、今度は落ちましたorz

パースが終わって、
Generating page documentation…
Generating group documentation…
Generating group index…
Generating class documentation…
Generating annotated compound index…
Generating alphabetical compound index… ← ここでおちます。

昔よりはかなり扱い安くなっているかもーなだけに、なんともかんとも残念。
zipの方を落としたのですが、インストーラーの方はフロントエンドのGUIもはいっているようです。

ところで、周りをみてると、Javadocで書いてますってのをよく見かけるんだけど、実はQt-Styleの方がマイノリティなのかしら?
別にこだわりはないんだけど、コマンドが全部Qt-Styleなんだよね。
Javadocを選んだ人はなんでそっちを選んだのか教えてくださいませw