本アプリ制作で困ったことのメモ
このアプリはかなりの長い期間開発していましたが、難易度もかなり高かったのでいろいろな問題にはまりました。ちょっとメモ的にここで残しておきたいと思います。
浮動小数点精度不足問題
アホなんです。Unityの3D空間の長さに関係する問題です。自分の性分であまり最初に考えないで始めます。地球生命進化と同じで生き残れるのであればそのまま突き進む。
今回の空母機動部隊決戦も同じアプローチ。ここを良く考えれば良かったですけど今更仕方がない。
Unityの3D空間には長さの単位があります。1=1mにすると良いとか読んだように思っていたので基本はそうしています。なので例えば赤城のアセットを入手すると250単位の長さに調整します。このようにして多数の艦船を創り、それをプレイヤーのための艦隊をCPUのための艦隊に分けて配置します。流石に航空機の航続距離までリニアで創ろうとは思っていませんでしたが、機動部隊を配置できる広大な海域ブロックを8方位x3距離の24個創って、それぞれのブロック内に雲や艦隊等を配置するように考えて創りました。
0点付近(Unity3D空間の原点付近)で1つのブロック空間を創ってその中のコンテンツをダイナミックに変えるようにすれば良かったのですが、最初は見通しが悪くて、それぞれ配置された艦隊や航空機が独立にかつ並列に動けるための空間を構築したかったので、24ブロックをベタに分割配置したのです。ブロックの干渉を避けるためにブロック間を結構開けてです。
そしていろいろ艦隊の動作や索敵の処理を創りこんで動かしていくと、0点から遠い場所に配置されたブロックで遠く離れた艦船を空から見ると安定したレンダリングにならない問題が発生しました。これ良く考えればわかるのですが、浮動小数点の仮数部は23ビットしかないので、0点から遠く離れたところでの細かい分解能は不足してきます。駄目だよねこれ。
この時点で全てをdouble化すれば良かったのかも知れないのですが、Unityで最初の最初から何も考えずにfloatで使ってきていたのでこの変更は厳しすぎます。なので操作対象となるブロック全体をダイナミックに0点付近に持ってくる仕組みにして何とかしのぎました。
今後はこういうことのないように注意します。
得られた知恵:最初のインフラ系くらいは少しは考えろよな
Zファイティング(iPhoneとAndroidの違い)
この問題は上記の浮動小数点精度問題と関連はあるのですが、基本的にきっちりと事前に考えられていない広大な仮想空間内でのシュミレーション実施で発生している事象と考えています。
Zファイティングとは3Dレンダリング処理を行うときに、わずかにカメラからの距離が異なる平面が存在するときに、どちらの平面を表示するのかがレンダリング計算上で優先度が異なるために両方の面がちらちらと見え隠れする現象です。
自分はmacでUnity, Xcode等を使って開発していますが、高高度を飛ぶ航空機から海面上の艦船を見下ろしたときに、艦船や艦船の波パーティクルや海面上の波や浮遊物等はmac上での動作では期待通りに動き(当然そう作りますのでそうなります)、iPhone上では基本的には同じように動きます。ところが、Android上でのレンダリング処理、特にZファイティングに関して違う挙動をしました。
Zファイティングの対策法は幾つかありますが、Android側だけで特別な処理を追加しなければならず、結構苦労しました。時には艦船の創る波パーティクルを海面から数メートル浮かさなければならない状況もありました。
この問題は自分の最初の基本方針が無知であり間違っていたために発生した特殊な例ですが、こういう問題が最後のほうで発覚するのは要注意ですね。このiphoneとandoroidのレンダリング処理の違いというのはネット先生でも英語を含めてあまり事例が見つかりませんでした。
得られた知恵:必要もないのに用意された機能の限界付近を使うということは厳禁
ということでした
Unity関連情報サイトによる問題解決
Unityの本当にすばらしい点は、何か問題にぶつかったときに、日本語で「Unity レンダリング ちらつき」とかと打ち込むとすぐにその原因と解決方法が複数のサイトから多様的な情報として日本語で得ることができる点です。
Unity使ってiphone/androidで動くシュミレーションアプリを創ることは相当多岐に渡る障害に日々ぶつかりながら、その原因を知り対策を立てて先へ進むことを毎日繰り返すこととなります。なので、Unityの環境は本当にすばらしいです。
見落としがちですが、自分にとっては多様な情報を入手できるということが重要です。他の人には違うのかも知れませんが、自分の場合には、同じことを説明されていても、あるサイトでの説明だとちっとも頭に入らないのだけど、別のあるサイトだとすんなに入るということがあります。また、あるサイトで理解できなくても、その断片のみを何となく理解している状況で他のサイトを見ると、なるほど!っとなって本質理解できることがあります。なのでこの多様な情報入手ということは大事です。
この多様性については盲点があります。Unityの話、AppleのXcode, AppStore, iTunes等に関してはググルと多様なサイトでの多様な情報が数多く得られます。ところが面白いことにgoogleに関するサービスの情報(google play登録とか)に関しては多様性が一気に失われます。なぜかといえば、すべてがgoogleの説明ページしか出てこないからです。他の方の場合はどうかわかりませんが、自分の場合にはgoogleさんの説明をどうも良く理解できないという問題があります。かなり丁寧に書いてくれているのですけど、そこはかとなく上から目線で書かれた内容がどうも頭の中にすんなりと入ってこない。という悩みはあります。
ですけど、本当に多様な情報がネットで簡単に得られるUnityと関連サイト構築者の皆さんには大変感謝しております。
ちかいうちに何時もお世話になっているUnity関連サイトを体系的に整理してこのブログで紹介させて頂くようにします。
最後に
今回で「空母決闘空間1942」の開発紹介は一旦終わりとします。次は別のアプリの開発紹介を考えています。また、現在開発完了直前のアプリもありますのでこれも紹介したいと思います。
以上