クロスプラットフォヌムシャンデリア

GameDevず燭台の蚘事では、ゲヌムMaryageをAndroidに移怍するプロセスに぀いお説明したした。 ゲヌムは倧成功を収め、リリヌス埌ほがすぐに、オンラむンをさらに重芖したクロスプラットフォヌムバヌゞョンの蚈画を開始したした。 プラットフォヌムずしおUnity3dが遞択されたした。 開発プロセスには玄6か月かかりたした。



面癜い カットの䞋に来お





タスク



そのため、プラットフォヌムが遞択され、パフォヌマヌもシンプルで明確なように芋えたす。目に芋える問題は地平線䞊に芋えたせん。

開発は条件付きで2぀の郚分に分けられたす-バック゚ンド以䞋ロゞックず呌ばれたすずフロント゚ンドプラットフォヌム機胜を備えたGUI、以䞋クラむアントず呌ばれたす。 プラットフォヌムずしおUnity3dが遞択されたしたブランド名の倉曎や「3d」ナニット自䜓の欠劂に぀いおは説明されないように、本文でさらに詳しく説明したす。 ロゞックはすでに蚘述されおおり、完党に機胜しおいたす。 唯䞀の問題は、ロゞックが蚘述された蚀語がjavaであり、遞択されたプラットフォヌムに適したのはCたたはJSだけだったこずです。 したがっお、䞻なタスクは、機胜を1察1に維持しながら、既存のコヌドを有効なCコヌドに移怍するこずでした。

クラむアント郚分もすでに実装されおいたすが、ロゞックず同様に、AndroidでのGUIの実装に厳密に関連付けられおいたした。 したがっお、技術的に有胜なTKによれば、「Androidバヌゞョンず同じになるように」ずいうフレヌズの圢匏でクラむアントはれロから䜜成する必芁がありたした。



ロゞックの移怍



タスクは、最小限の曞き換えでこれを可胜な限り迅速に行うこずでした。 しかし、䟝然ずしお䞀連の問題に盎面する必芁がありたした。



Cでは拡匵可胜な列挙型はありたせんが、Preferenceではこの型が非垞に広く䜿甚されおいたした。カヌドスヌツずランク、カヌド自䜓、芏玄、ベットずホむスト、ゲヌムの状態。 堎合によっおは、Cの暙準列挙型でうたくいくこずができたした。 しかし、ほずんどの堎合、列挙型は単なる列挙型ではありたせん。さたざたなデヌタが結合され、ヘルパヌメ゜ッドがありたした。 移怍されたコヌドでこれをすべお倱いたくありたせんでした。 その結果、CのJavaクラスEnumが最小限になりたした。 すべおの元の列挙型は、以前のデヌタず機胜を保持する別個のクラスになり、Cからの通垞の列挙型が添付され、シヌケンスEnum.ordinalメ゜ッドず列挙名Enum.nameが蚭定され、 switch..caseで䜿甚されたす。



Delphiの重い遺産は、Cに移怍するずきにも感じられたした。 ほずんどのロゞックは、共有倉数を䜿甚しお内郚プロシヌゞャで蚘述されおいたす。 Javaでは、これは比范的簡単に解決されたした-内郚クラスによっお。 Cでは、内郚クラスがありたすが、Javaの静的クラスに䌌おいたす。぀たり、コンテナクラスのフィヌルドずメ゜ッドを䜿甚できたせん。 サむトリンクを远加する必芁がありたした。



Cでの配列の豊富な遞択にもかかわらず、そこには同様のJava機胜はありたせんでした。 問題は、int [] []ずいう圢匏の配列は、new int [10] [20]のような単䞀の挔算子では䜜成できないこずです。 どこにでも長方圢の配列に行くこずはできたせんでした;堎合によっおは、サブ配列が別々に䜿甚されたした。 倚次元配列を完党に䜜成するヘルパヌメ゜ッドを䜜成する必芁がありたした。



他にも䞍䟿な䞍䟿がありたした。



しかし、これらはすべおコンパむラヌによっお明らかにされたした。 しかし、Javaシンボリック型バむトを切り取り、Cからアナログsbyteに倉曎する必芁がありたした。



顧客導入



すべおのグラフィックコンテンツは完党に小さな修正を加えおAndroidバヌゞョンから借甚されたした。 NGUIがGUIフレヌムワヌクずしお遞択されたした-原則ずしおオプションはありたせんでした。アトラスの操䜜、DrawCallsの最小化によるレンダリングによる最適化、unity3dメッセヌゞシステムを䜿甚した健党なメッセヌゞシステムです。 このフレヌムワヌクの䞻な開発者がunity3dの暙準GUIを芋おいるのも䞍思議ではありたせん。



すべおのコンテンツは論理グルヌプに分類され、アトラスあたり2048x2048ドットの制限に基づいおアトラスに収集されたした。





郜垂のアむコンの地図少なくずも6぀の郜垂の堎所がただありたす。





すべおの「画面」で䜿甚される䞻なコントロヌルの地図。



このようなグラフィックコンテンツの線成により、ピヌク時のDrawCallsの数を15に枛らすこずができたしたたずえば、スクロヌルされた入札パネルを開いお、芖芚蚭定でメニュヌを開くずき。



問題の1぀は、「Androidの堎合ず同じこずをすべお行う」必芁がありたした。぀たり、画面解像床のコントロヌルを調敎するこずでした。 通垞、すべおのコントロヌルは画面の端に「固定」され、スラむド/離れおスラむドしたす。この堎合、このオプションは受け入れられたせんでした。 その結果、次のスキヌムに埓っおほが機胜する゜リュヌションが䜜成されたした。



任意の解像床で起動した堎合、画面の高さは垞に800の仮想ポむントに等しいず芋なされ、幅はアスペクトによっお異なりたす。 最初のヘルパヌは、再配眮ずズヌムを実行した結果に応じお、叀いアスペクトず新しいアスペクトの関係を考慮したす。



基準解像床1280x800。





広いアスペクト1136640-瞁に瞞暡様が芋える。





同じ解像床1136x640、ヘルパヌを䜿甚した結果-コントロヌルが比䟋しお広く配眮され、背景が拡倧瞮小されおいるこずがわかりたす。



その結果、すべおが参照解像床で行われ、+最も狭いアスペクト43でテストされたした。



たた、コントロヌルの非暙準の動䜜を実装する必芁がありたした。これは、統䞀されたメッセヌゞシステムNGUIのおかげで、比范的単玔であるこずが刀明したした。 これが、LongPressボタン、クリップ付きのクリヌプラむン、゚レメントのアニメヌション化された再配眮を䌎うグリッドの実装方法です。 たた、プロゞェクトに適応するために暙準コンポヌネントのいく぀かの堎所にパッチを適甚する必芁がありたしたUIPopupは、珟圚のコンポヌネントではなく、指定された芪にポップアップパヌツを衚瀺できたした-UIPanelコンポヌネントによるポップアップコンテンツのクリッピングの問題は解決されたした。無効な芁玠などを無芖するこずを孊んだ子䟛によるスクロヌルパネルの䞭倮揃え小さな修正。



クラむアントのすべおの䜜業は、特定の「画面」でのロヌカルロゞックの動䜜を瀺す「画面」に分割されたした。メむンメニュヌ画面、「トレヌニング」蚭定画面、「トヌナメント」の郜垂遞択画面、ゲヌム自䜓の画面などです。 これにより、各時点でのメモリ消費の芳点からグラフィック郚分の負荷を枛らすこずができたした。次の「画面」をロヌドするず、ロヌドされたすべおのオブゞェクトが砎壊され、゚ンゞンは解攟されたメモリをクリアするか、それを䜿甚しお新しいリ゜ヌスをロヌドできたした。 シヌン間では、蚭定、最埌に遞択したアむテムなどの芳点からナヌザヌデヌタぞのアクセスを提䟛する「ロヌルアラりンド」する、殺すこずができないオブゞェクトがいく぀かありたす。



クラむアント偎で䜜業が開始されるたでに、ロゞックずの察話甚のAPIは承認されおいなかったため、すべおのゲヌムメカニクスを分離したモゞュヌルに分割するこずにしたした各ナヌザヌのカヌドセットの管理、カヌドの「フラむング」の制埡、ベットの管理、プレむダヌのテキストメッセヌゞの管理、情報パネル、ゲヌム蚭定、ロヌカル状態などの管理、シングルトヌンを介しおゲヌムプロセスのどこからでもアクセスできたす。 同時に、クラむアント内郚で盎接テストのようなものが曞かれ、利甚可胜なすべおのメ゜ッドをダンクしお、この経枈党䜓の正しい動䜜を怜蚌したした。 すべおのアニメヌションやその他のこずは、コルヌチンを介しお1぀のストリヌムで機胜したす。ここでは特別なこずは䜕もありたせん。



倖郚システム



これには、IAP機胜、バナヌ広告、広告プラットフォヌムの特定のアクションに察しお無料でゲヌム内通貚を受け取るためのTapjoyクラむアント、およびGoogleAnalyticsの実装が含たれる堎合がありたす。



Soom.laはもずもずIAPフレヌムワヌクずしお遞ばれたしたクロスプラットフォヌムAPI、2぀の䞻芁なモバむルプラットフォヌムのサポヌト、Androidスタヌトアップスタヌトアップパッチの呚りの束葉杖なしのシヌムレスな統合、それはすべお無料です。 プラむム31郚門の統合の恐ろしさを比范するだけで十分です。愛する人のためだけにマニフェストを匷制的に粉砕し、プラットフォヌムごずに異なるAPIを䜿甚しお、このフレヌムワヌクが玠晎らしいこずを理解したした。 将来winphoneバヌゞョンが必芁で、soomlaが定期的なサポヌトを受けない堎合、 Unibillぞの移行が可胜です。



Admobはバナヌプロバむダヌずしお機胜し、 http//www.neatplug.comの補品がそのクラむアントずしお遞択されたした。 理由は同じです-簡単な統合、統䞀されたAPI、2぀の䞻芁なモバむルプラットフォヌムのサポヌト、2぀のプラットフォヌムのナニバヌサルバヌゞョンのコストは56ドルですprime31ず、IAPの䞊蚘の劚害は各プラットフォヌムに察しお50ドル。 バナヌが異なるDPIに完党に配眮されたずきに、フレヌムワヌクの十分に適切でない動䜜が芋぀かったため、結果ずしお、画面の境界ぞの暙準バむンディングに制限するこずにしたした。



サむト自䜓の暙準フレヌムワヌクは、Tapjoyのクラむアントずしお機胜したした。 ゚ディタヌでの正しい䜜業のためのコヌドはわずかに終了し、䞀般的な統合は問題を匕き起こさず、゚ミュレヌタヌでのビルドの4-5開始でログによるむベントのトリガヌを確認するのに十分でした。



GoogleAnalyticsは自䜜で、Webサむト甚のバヌゞョンから改造されおいたす。 その結果、異なるプラットフォヌム甚のネむティブバヌゞョンのラむブラリを50ドルで必芁ずしない、WWWを介したクロスプラットフォヌム゜リュヌションが実珟したす。



むンタヌフェむスロゞックずクラむアント



4か月埌、ロゞックの最初のバヌゞョンが衚瀺され、クラむアントずのドッキングを開始できたした。 ロゞック自䜓は、無限のルヌプで回転する独立したアプリケヌションずしお開発され、コマンドの発信時にチヌムをキュヌに入れたり、サブスクラむバヌメ゜ッドをプルしたりできたす。 その結果、unity3dのロゞックは、別のスレッドで開始を制埡し、䞡方向のコマンドの転送を保蚌するコヌドでラップされたした䞡方のシステムが独立しお開発されたため、デヌタ型、メ゜ッドシグネチャなどが完党に互換性がないこずを忘れないでください互いに、2人の異なる出挔者から。 奇劙なこずに、すべおが驚くほど簡単に䞀緒に成長し、管理チヌムはクラむアントモゞュヌルにうたく萜ちたした。



タヌゲットランタむムの問題



別のスレッドでロゞックの䜜業を行うず、あたり良くない話が1぀起こりたした。 ご存じのように、iOSでは非ネむティブコヌドを䜿甚するこずは犁じられおいるため、プロゞェクトを゚クスポヌトするずきにunity3dはAOTを介しおマネヌゞアセンブリを実行し、既にシステムにリンクされおいる出力ラむブラリを生成したす+ obj-cのすべおの皮類の接着剀ラッパヌが远加されお、良さ。 さらに、゚ミュレヌタヌ甚に個別のビルドが䜜成されたす.JITがあり、゚ディタヌで動䜜するようにすべおが機胜したす-これは重芁です。実際のハヌドりェアで発生する゚ラヌぱディタヌでも゚ミュレヌタヌでも発生しないためです。

぀たり 実際、実際のハヌドりェアで実行しおいる堎合-プロゞェクトのデバッグは行わず、ログずタむをタッチするだけです。

それでは、スレッドの問題に戻りたしょう。 すべおが機胜しおいるように芋えた埌、突然クラッシュし始め、アプリケヌションを完党にドロップしたした。 xcodeログによるず、スレッドが䞭断された堎合毎回ではない堎合Thread.SleepたたはThread.Current.IsAliveを呌び出した埌、Monoランタむムで深いクラッシュが発生するこずが刀明したした。 ぀たり ストリヌムを䞭断する䞀芋暙準的な詊みで、暙準メ゜ッドの呌び出しでクラッシュを受け取りたした。 面癜いこずに、ビルドのJITバヌゞョンたずえば、Android、スタンドアロン、Webプレヌダヌでは、すべおが正垞に機胜したした。 pokeメ゜ッドを䜿甚しお、䞊蚘のメ゜ッドが決定され、クラッシュに至りたした。 その結果、ストリヌムの匷制的な䞭断を攟棄し、代わりに、終了する時間になるこずをロゞックに通知し、ストリヌムが閉じるのを埅぀こずにしたした。 クラッシュは消え、二床ず戻りたせんでした。



2番目の問題は、AOTを凊理した埌、実際のハヌドりェアで実行するずきにdoubleタむプを正確に䜿甚する堎合のAIの動䜜の蚈算が正しくないこずです。 ゲヌム戊略の分析で䜿甚された蚈算を含む膚倧な数のログを収集する必芁がありたした。 各テストゲヌムのログサむズが40 MBのプレヌンテキストを超えたした。 これらはすべお、䜕らかの方法で実際のハヌドりェアで実行されおいるアプリケヌション内で収集し、倖郚に削陀する必芁がありたした。 最初はGoogleDocsを介しおログを収集しようずしたしたが、速床ず蚱容されるボリュヌムが䜎䞋するため、サヌバヌはnode.jsですばやく蚘述され、ポストリク゚ストを介しおデヌタを受け入れ、ロヌカルテキストファむルに貌り付けたした。 アプリケヌション偎からは、すべおがログ゚ントリのキャッシュキュヌ+暙準WWWを介しお自䜜のhttpサヌバヌにオヌバヌフロヌする際のダンプずいう圢で実装されたした。 それはすぐに刀明し、比范的簡単でした。



テスト䞭



テストプロセス党䜓は、 https//testflightapp.comプラットフォヌムを䜿甚しお、䞭間AndroidビルドずiOSの開発のすべおの段階の䞡方で行われたした。 テスタヌのデバむスのUIID番号が登録埌に自動的にクラむアントGUIを介しお収集され、プロビゞョニングプロファむルが曎新され、リストされたリモヌトデバむスのむンストヌル暩限でビルドが既に収集されたした。 ipaビルドをビルドした埌、管理パネルを介しおテストフラむトに移動し、すべおのテスタヌに​​電子メヌルアラヌトでアクセスが蚱可されたした。 圌らがクラむアントに入り、ビルドボタンをクリックするだけで、すべおが自動的に行われたした。 testflightサヌビスずの远加の統合は実行されたせん。これは、ネむティブラむブラリずの別の統合を必芁ずし、利益をほずんどもたらさないためです。



うたくやりたいなら、自分でやりたしょう



Androidバヌゞョンのゲヌムを宣䌝するためにレビュヌを泚文したせんでしたが、iOSの堎合、人気のあるリ゜ヌスでレビュヌを1぀泚文するこずにしたした。 財務面に぀いお話すのは時期尚早ですが、レビュヌの質に぀いおの印象を共有したいず思いたす。 支払い埌、泚文確認曞ず審査リク゚ストが届きたした。 承認のためのレビュヌ自䜓は時間通りに来たしたが、それを開かないほうが良いでしょう。 レビュヌを曞いた人は、メむン画面の3぀のボタンを抌すこずさえしなかっただけでなく、ゲヌムの仕組みを理解しようずさえしたせんでした同意する、これは゜リティアではありたせんが、圌は曞く方法を知りたせんでした。 技術的なミスに加えお、蚘事には「ポむントから蚈算されたできるだけ倚くのポむントを獲埗する必芁がある」ずいうようなフレヌズがたくさんありたした。 りィキペディアのコピヌず貌り付け、および8幎生の3歳の゜ヌスの䞋での私たちの助けは明らかに私たちに合わず、私たちは自分でレビュヌを曞きたした。 批刀の結果、レビュヌの2番目のバヌゞョンを受け取ったこずは泚目に倀したすが、ナヌザヌに衚瀺できるものずはほど遠いものでした。



たずめ



Unity3dは珟圚、クロスプラットフォヌムゲヌムを䜜成するための最高のプラットフォヌムです。 GUIの䜜成に特別な問題はありたせんでしたが、さたざたなプラグむンの統合には圓初の意図よりはるかに長い時間がかかりたした。 たた、すべおがあなたのために機胜し、楜しい嚯楜のための䜙分な日がない堎合、プラグむンたたはUnity3d自䜓を曎新しないでください。 たた、クロスプラットフォヌムが保蚌されないこずを忘れないでください。すべおのプラットフォヌムでロゞックをデバッグする準備が必芁です。

Androidの堎合、これたでのずころ、クロスプラットフォヌムバヌゞョンを䜿甚しないこずにしたした。2.2および2.3に基づくデバむスそれぞれナヌザヌの4ず10が䜿甚は、単にそれを取埗せず、OutOfMemoryから脱萜するためです。 これらのデバむスがすぐに過去のものずなり、それによっおオンラむン版の開発が簡玠化されるこずを願っおいたす。



All Articles