Unity開発メモ:GameObject.Find()

 GameObjectの参照でハマってしまった。
階層構造になっているオブジェクトを作って、その親側のスクリプトの中でインスタンスメソッドのように gameObject.Find("childとか") を実行すると、当然その配下の子オブジェクトの参照を取得できると思っていた。でもFindはクラスメソッドなので、同一名称のオブジェクトが他にある場合はそうならない。よく考えると当たり前なのに今まで全く気づかなかった・・。


Unityでアプリを作る

 試行錯誤しながら少しずつ進めてきたUnityアプリが、やっと形になってきた。元々、箱庭風の街を舞台にしたゲームを考えていたけど、イメージが固まらなかったので子供向けのシンプルなおもちゃアプリにすることにした。

まだ何をやるにしても調べないと分からないが、やっぱりUnityは触っていて面白い。出来ることが少しずつ増えていくのが快感だ。

Unityでのモデリングデータの読み込み

 メタセコイアで作ったモデリングデータをいくつかの形式で出力して、Unityで読み込んでみた。(クリオネ3D用に作ったやつ)


・model.dxf:面がところどころ捻れている。
・model.3ds:面は完璧。テクスチャが正しく貼られない。
・model.fbx:面もテクスチャも完璧。

プラグインを導入して出力したfbx形式でのみ正しく読み込めた。また、マテリアルとDrawCallsの関連も確認することができた。

OpenGLで実装したクリオネ3Dのときは、Lightwave形式で出力してcソースに変換して実行時にまた少し変換して、という面倒なことをやっていた。やっぱりそのまま読み込めるのは便利だな。

Unity製iPhoneアプリの実行速度

 床、自機(立方体、影付き)障害物(立方体)というシンプルな構成のテストアプリを作って、iPhoneなどの実機でどのくらいの速度が出るか調べてみた。
(Draw Calls: 8、テクスチャなし、スクリプト少しあり)

・iPhone4(Retina): 10fps前後
・iPhone3GS: 30fps
・iPad2: 30fps
・iPad: 10fps前後

どういうわけか機種によって大きな差が出てしまった。色々と設定や表示項目を変えて原因を探ったところ、丸影(Shadow Projector)をOFFにすると全ての機種で30fps出ることがわかった。

ただ、影の有り無しで表現力に大きな違いが出るので、できれば使いたい。Layerを分けて影の適用を床だけにしたところ、10fps->20fpsと効果があったものの、なめらかな表示とは言いにくい。

残念ながらiOSでは基本的に丸影を使わない方がよさそうだ。
ちなみに、iPhone4でも解像度を320x480に固定すると、丸影あり、AAx2オンで30fps出た。Retinaだと単純に4倍の処理時間がかかってしまうということなんだろうか。

Unityのエディタ

 UnityにはMonoDevelopというスクリプトエディタがついているが、これがとても使いづらい。動作が重いし、メニュー表示も内容も化け化け。一応表示に関しては色々設定を変更してやると直るんだけど、日本語を入力する方法は今のとこ無いっぽい。スクリプトをUTF-8にしてやればコピペ&保存は出来るようになるようだから、これで我慢するしか無いか。

Unityアプリの起動画面

 iOSライセンス(¥36500)を購入するとiPhone用にビルドできるようになるが、このライセンスではデフォルト起動画面から変更が出来ない。

【デフォルトの起動画面】

【iOSビルド設定画面】

ただ、生成されたiOSプロジェクトにはDefault.pngやDefault@2x.pngファイルが見えているので、これを差し替えれば済む話じゃないの?と思ってやってみたら、そうは問屋がおろさなかった。起動時に次のようなエラーが出てしまった。
どうやら厳密に日付やファイルサイズをチェックしているっぽい。
偽装する手段はあるかも知れないが、ちゃんとProライセンス(¥136000+¥136000-¥36500)を買ったほうが良さそうだ。Unityアプリで売上がでてくれれば買いたいけど・・。当面の目標は20万だ。

Unity製iPhoneアプリのファイルサイズ

 PC上でちゃんと動いても、最終的にiPhoneで動かないと意味がない。
まずはファイルサイズがどうなるか調べてみた。


使用したのはAssetストアからダウンロード出来る「Penelope」という無料サンプルアプリ。仮想パッドや画面タッチでの操作方法が実装されているので、とても参考になる。
(ただ、Retinaのレイアウトに対応してないみたい。)


iPhone/iPad用のビルド設定画面は、このようになっている。
この中でファイルサイズに影響がありそうな「Target Device」と「Target Platform」を変えて調べた。

ファイルサイズzip圧縮後
Device: iPhone + iPad
Platform: Universal armv6+armv7
42.9MB16MB
Device: iPhone Only
Platform: Universal armv6+armv7
42.8MB15.9MB
Device: iPad Only
Platform: Universal armv6+armv7
42.8MB15.9MB
Device: iPhone Only
Platform: armv6 (OpenGL ES1.1)
27.5MB10.7MB
Device: iPhone Only
Platform: armv7
27.7MB10.7MB

Target Deviceによる差はほとんど無い。iPhone/iPad両対応できそうな内容なら、せっかくだからUniversalでリリースした方が良さそうだ。
またPlatformは、armv6+armv7がarmv6、armv7と比べてかなり大きいが、圧縮すると20MB(3G回線でダウンロードできる制限)に収まった。


ついでに実行速度を少し調べた。条件は以下のとおり。
・端末:iPhone4 (iOS 4.3.5)
・Target Resolution: Native
・「Penelope」アプリで「Tap to Move」を選択した画面の状態
・xcodeのCore Animationで数値を見る

フレームレート
Platform: armv713fps
Platform: armv6 (OpenGL ES1.1)24fps
Platform: Universal armv6+armv713fps
Platform: Universal armv6+armv7
Script Call Optimization: Fast but no Exception
13fps

なんと予想に反して、armv6でビルドしたものが一番早かった。
端末によっても結果が変わってきそうなので、これについては今後詳しく調べてみよう。

ちなみにこのアプリは、AAx2を有効にしてもiPhone3GSで実用的な速度で動作した。解像度で表示性能に大きな差がでそうな場合は、Target Resolutionの設定でRetinaを無効にした方がいいのかも。

Unityで遊ぶ その2

 前回に引き続き、Unityのお勉強。
今回はもう少しリアル指向で無人島を作ってみた。

・光(Directional Light)を配置する。
・Create Terrainで地形ベースを作成する。

・Terrainの地形ブラシツールで地形の凹凸を作る。
(ポピュラスを思い出した)

・パッケージ(Terrain Assets)をインポートする。
・砂場テクスチャを下地として読み込む。

・緑地テクスチャを読み込んで、ブラシツールで適当に塗る。

・木オブジェクト(Palm)を読み込んで、適当に配置する。

・パッケージ(Water : Basic)をインポートする。
・海(Daylight Simple Water)を配置する。

・パッケージ(Light Flares)をインポートする。
・空のGameObjectを作成し、Component->Rendering->Lens Flareを選択する。
・InspectorでFlare: 50mm Zoomを指定する。

・パッケージ(Skyboxes)をインポートする。
・Render Settingsで霧(Fog)と空(Skybox)を設定する。

これで地形の作成は完了。

・パッケージ(Character Controller)をインポートする。
・3rd Person Controllerを配置する。

・パッケージ(Projectors)をインポートする。
・上で作成したキャラクタに影(Blob Shadow Projector)を設定する。

完成!!
実行すると、ちゃんと地形に沿って島を自由に歩き回ることができる。


Unityで遊ぶ

 Unityを少しずつ勉強している。まだツールの使い方を試している段階。
今日は、都会の町並みっぽい空間を歩き回れるサンプルを作ってみた。

まず、床(Plane)と光(Directional Light)を配置する。

次に立方体(Cube)を適当に並べる。

それを複製する。

適当に高さを変えて、ビルっぽくする。

床、光、立方体を選択して、Lightmappingで影を生成(Bake)する。
※無料版では影の動的生成が出来ないので、こうやって影テクスチャを作る。

描画設定(Render Settings)で、霧(Fog)と空(Skybox Material)を有効にする。

自機(3rd Person Controller)を配置する。

自機に丸影(Blob Shadow Projector)を追加する。

完成!!
実行すると、この空間を自機を3人称視点で歩きまわることが出来る。
カメラは自動的に自機を追尾してくれて、建物にはちゃんと当たり判定がある。
さらに自機には、歩く、ジャンプするなどのモーションが組み込まれている。

素材の作成やプログラミングを一切しないで、マウス操作だけでゲームっぽいものをつくることが出来た。こうやってアイデアをすぐ形にして確認できるのはとても便利だ。(ただ、これをiPhoneなどでまともに動かすためにはチューニングや操作プログラムが必要になる。)

Unityセミナー

 都内某所のUnityセミナーに行ってきた。機能の説明はほとんどなかったのでまだ開発アプリのイメージがぼんやりしているが、Unityでの開発の進め方/考え方がとても参考になった。

特に心に残ったのは、ゲームマネージャークラスなどでゲームやオブジェクトを管理する方法はUnity的ではないということ。昔Flashで何度か開発をしたとき、タイムラインやオブジェクト毎のスクリプトはほとんど使わず、管理用のActionScriptで全て制御するようなプログラミングをしていた。可読性やバージョン管理のしやすさを考えるとこれがベストだと思っていた。でもこの考え方をUnityに持っていくのは良くないようだ。

あと、ゲーム開発例を見てワクワク出来たのが大きい。かなりモチベーションが上がった。今年中に簡単なUnityアプリをリリースしたいな。

calendar
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
<< December 2018 >>
selected entries
categories
archives
recent comment
others
mobile
qrcode