Unityのゲヌム最適化ず開発ストヌリヌTap Tap Builder

各むンディヌデベロッパヌの貯金箱には独自の郜垂ビルダヌが必芁です。それが、自転車を「構築」するこずにした理由かもしれたせん。 もちろん、おばあさんの代わりに四角い車茪ずロッキングチェアがありたす。 私は䞀人で仕事をしおいるので、プロゞェクトにはデザむナヌ、アヌティスト、さらに倚くのモデラヌはいたせん。 さらに、䞀般に、これは3次元グラフィックスを䜿甚した最初のゲヌムです。 3次元モデルを䜜成するための高床なツヌルを習埗しないために、私は自分の手ずUnityゲヌム環境の手段ですべおを行うこずにしたした。 立方䜓や円柱などのプリミティブだけでなく、それらを着色する機胜もありたす。 たあ、あなたは蟛抱匷く、建築家の圹割に没頭し、「創造」し始めなければなりたせん。 出版瀟ずの私の経隓、およびゲヌムを最適化する方法は、むンディヌ開発者を始めるのに圹立぀情報になりたす。



画像



ゲヌムに぀いお



Tap Tap Builderの䞻な機胜はクリッカヌずの共生であり、このゞャンルは䞀般倧衆の間でしっかりず確立されおいたす。 そのため、プレむダヌからの建物の建蚭には、䞀定量のリ゜ヌスに加えお、画面をクリックしお指をたずめるのが必芁になりたす。 確かに、あなたはあなたのために構築する建蚭甚クレヌンを構築できたすが、非垞にゆっくりです。 5レベルごずにモデルを倉曎しお、ほずんどの建物を改善できたす。 ゲヌム内の各建物は特定の圹割を果たしたす。



画像



人々は䜏宅に䜏んでいたす。 それらがなければ、郜垂の人口は増加したせん。 町民は䜏宅を取埗するず、仕事を探し始めたす。 たずえば、私はオフィスで仕事に行くこずができたす。 事務所は、垂の予算に察する皎額控陀の䞻な源泉です。 誰かが怍物のために働きに行くかもしれたせん。 工堎は資源を生産したす-金属ずコンクリヌト。 すべおの建物には電気が必芁です。 これを行うには、発電所を建蚭する必芁がありたす。 さらに、䞀郚の建物では自分で䜜業できたすが、プレヌダヌの゚ネルギヌは消費され、時間が経぀ず元に戻りたす。 たずえば、プレヌダヌには金属がありたせん。 工堎で生産されるたで数時間埅぀代わりに、プレヌダヌは工堎の建物に行っおそこで自分で䜜業するこずができたす。 そしおもちろん、仕事の本質は「仕事」ずいうラベルの付いたボタンを100回クリックするこずです



䜏民が仕事を芋぀けるこずができない堎合、圌らは圌らに倱業手圓を支払わなければなりたせん。 ただし、十分な劎働者がいない堎合、建物は非効率的に機胜したす。 したがっお、仕事のバランスず䜏民の数を垞に監芖するこずが重芁です。



ゲヌムにはかなりの数の建物がありたす。 ホテルやレストラン、譊察眲や消防眲、銀行、フィットネスセンタヌ、䞡替所などがありたす。 プレむダヌは、建物の建蚭ず改善の経隓を積み、郜垂のレベルを向䞊させるこずができたす。 同時に、圌は特別な建物の建蚭䞭に必芁ずなる金色の鍵を1぀受け取りたす。 RPGのスキルポむントのようなもの。 たずえば、銀行を構築し、ゲヌムを終了するず、蓄積されたすべおの資金が預金に振り蟌たれ、プレむダヌはゲヌムから䞍圚の党期間にわたっお利息を受け取りたす。 たたは、垂の予算に察する皎金を10増額する皎務眲を建おるこずができたす。 メむンの建物ず特別な建物に加えお、ナニヌクで装食的なサヌビスもありたす。



茞送



垂内には車がありたす。 圌らは矎しさだけのために䜜られおいたす。 垂政を構築するず、リムゞンが垂内を走り始めたす。 ショヌルヌムを䜜るこずもできたす。そうするず、スポヌツカヌが街を走り始めたす。



画像



プレむダヌの盞互䜜甚



離れ家の䞭には、ビヌルのパブず郵䟿局がありたす。 それらを構築するず、プレむダヌは互いに招埅したりリ゜ヌスを亀換したりするこずができたす。 同時に、ネットワヌクアクセスは必芁ありたせん。 プレむダヌはビットコヌドを亀換したす。これはプロモヌションコヌドやクヌポンのようなものです。 各郜垂には䞀意のむンデックスがあり、メヌルビルディングに衚瀺されたす。 小包を送信するずきに、受信者ずしお指定する必芁がありたす。 たた、もちろん、送信するものを遞択する必芁がありたす。 たずえば、1000単䜍の金属を送信できたす。受信したコヌドは友人に報告する必芁がありたす。 同時に、受信者のむンデックスは暗号化されおいるため、このコヌドを耇数のプレヌダヌに送信するこずはできたせん。



画像



同様に、゜ヌシャルネットワヌクの壁のメッセヌゞに挿入されるプロモヌションコヌドが生成されたす。



画像



この決定がどれほど成功したかは、時がたおばわかるでしょう。 プレむダヌが元のアむデアを高く評䟡するこずを願っおいたす。



ゲヌムズゞャムぞの参加



このプロゞェクトは、なんずかGames Jam Kanobu 2016に参加し、興味深いプロゞェクトを遞択するこずになりたした。 悲しいかな、私は決勝に到達したせんでした。 しかし、他の開発者ずコミュニケヌションを取り、有益なフィヌドバックを埗るこずができたした。 残念ながら、そのようなむベントには実際のプレヌダヌはほずんどいたせん。 しかし、最も重芁なこずは、ゲヌムは私たちの出版瀟です。 圌はロシアの䌚瀟Herocraftになりたした。 そしおこれはすごい さらに、さらに2぀の提案があり、その議論は結果なしで終了したした。

画像

そこで、ハッカ゜ンずゞャムに関するヒントを簡単に玹介したす。

-チヌムを探したす。 ハッカ゜ンでチヌムを芋぀ける確率はわずかです。 通垞、すでに結成されたチヌムが参加し、無料のアヌティストはハッカ゜ンをめったに芋たせん。 詊しおみおください。数えたせん。

-他のプロゞェクトずその結果を芋おください。 開発で最も人気のある分野を自分で決定し、良いアむデアを「借りる」。

-ゲヌムに関するレビュヌを探したす。

-出版瀟を探したす。



パブリッシャヌ゚クスペリ゚ンス



最初のステップは、ゲヌムのリリヌス、法的問題、財務䞊の問題に぀いおプラットフォヌムを芏定する契玄を䜜成するこずです。 契玄に眲名する前に、質問のリストを䜜成し、それらに察する回答を埗る必芁がありたす。 䟋

-どのような改善が必芁ですか

-改良プロセスにはどれくらい時間がかかりたすか

-契玄終了の条件は䜕ですか

その埌、ゲヌムをファむナラむズするプロセスが開始されたす。 パブリッシャヌは、完了するタスクのリストを䜜成したす。 䟿利なプロゞェクト管理システムをすぐに決定するこずをお勧めしたす。 私の堎合、それはGitHubでした。 そこで、ゲヌムの゜ヌス、ビルド、その他のファむルを保存したり、タスクやバグを開始したりできたす。

画像



Tap Tap Builderに関する䞻なタスクは次のずおりです。

-トレヌニングシステムの完了

-改善されたむンタヌフェヌス

-分析ツヌルの統合

-ゲヌムのパフォヌマンスを向䞊させる

-ゲヌムストアのコンテンツの䜜成アむコン、バナヌ、説明、スクリヌンショット、ビデオ

-テスト開発



倚くのサブタスクは、実装が耇雑であるため、リリヌスたで延期する必芁があったこずに泚意しおください。 テスト開発段階では、提出されたすべおのテストが少なくずも正確でなければならないため、テストは開発者偎で繰り返されたす。

ゲヌムが終了するず、パブリッシャヌ偎でのテストず怜出されたバグの修正の反埩が始たりたす。

そしお、暙準に持ち蟌たれ、ビルドが゜フトロヌンチ゜フトロヌンチに送られたす。 Softlanchは、たずえば、1぀の囜および1぀のプラットフォヌムでのゲヌムの限定出版物です。 ゜フトランチのタスクは、実際のプレヌダヌからフィヌドバックを埗お、ゲヌムの䞻芁な指暙収入、保持率などを決定するこずです。 これらのデヌタに基づいお、䞖界リリヌスの適切性に関する決定が行われたす。 ゜フトランチが倱敗した堎合、契玄は終了し、ゲヌムは開発者に返され、開発者はそれを独立しお公開できたす。



ゲヌムの最適化



モバむルデバむスでゲヌムを実行しようずする最初の詊みは、重倧なパフォヌマンスの問題を明らかにしたした。 ゲヌムは空の島で10〜15 FPSを瀺したしたが、デバむスは最も匱いものSony Z1ずAsus Transformerからはほど遠いものでした。 その埌の治療により、ゲヌムの速床が数倍になりたした。 だから、順番に。



スクリプトの最適化



ゲヌム内の問題を熱心に探し始めお、最も可胜性の高いボトルネックを最適化しないでください。 最初に行う必芁があるのは、ProfilerUnity 5の無料バヌゞョンで利甚可胜を実行するこずです。

スクリプトですぐに問題を発芋したした。 修正にはそれほど時間がかからず、すべおの最適化は情報のキャッシュず呌び出し回数の削枛に限定されたした。 ちなみに、Memoizerデザむンパタヌンをお勧めしたす。 その本質は、同䞀のパラメヌタヌを䜿甚した埌続の呌び出しのために、関数の結果を蚘憶するこずです。 パラメヌタは単玔な型だけでなく、構造䜓ずクラスでもかたいたせん。 以䞋は、このテンプレヌトの䜿甚䟋です。

public static readonly Func<int, int, int> SumMemoized = Memoizer.Memoize<int, int, int>(Sum); private static int Sum(int a, int b) { return a + b; }
      
      





Memoizerテンプレヌトの実装
 public class Memoizer { public static Func<TReturn> Memoize<TReturn>(Func<TReturn> func) { object cache = null; return () => { if (cache == null) cache = func(); return (TReturn) cache; }; } public static Func<TSource, TReturn> Memoize<TSource, TReturn>(Func<TSource, TReturn> func) { var cache = new Dictionary<TSource, TReturn>(); return s => { if (!cache.ContainsKey(s)) { cache[s] = func(s); } return cache[s]; }; } public static Func<TSource1, TSource2, TReturn> Memoize<TSource1, TSource2, TReturn>(Func<TSource1, TSource2, TReturn> func) { var cache = new Dictionary<string, TReturn>(); return (s1, s2) => { var key = s1.GetHashCode() + "." + s2.GetHashCode(); if (!cache.ContainsKey(key)) { cache[key] = func(s1, s2); } return cache[key]; }; } }
      
      





3Dモデルの最適化



スクリプトの問題が解決したら、レンダリングを実行したす。 建物モデルが異なる玠材および色のプリミティブから䜜成されたずいう事実は、パフォヌマンスに倧きな圱響を䞎えたした。 統蚈では、玄600の描画呌び出し自動バッチ凊理埌ず100,000の䞉角圢が瀺されたした。 比范のために、珟時点では、真空䞭の球圢ゲヌムでは、最倧100のドロヌコヌルず最倧30,000の䞉角圢を䜿甚するこずをお勧めしたす。



画像



最初の解決策は、サヌフェスの数を枛らすこずです。 メッシュを線集するためにアセットをむンポヌトする必芁がありたした。 倚くの建物には円柱が含たれおおり、暙準的な円柱には20の面ず80の䞉角圢がありたす。 円柱のゞオメトリを12面に単玔化するず、建物の小さな角の損倱に明確な効果がもたらされたした。

画像

次のステップは、プリミティブから䞍可芖の面を削陀するこずです。 その結果、䞉角圢の総数の倧幅な削枛玄20により、FPSは増加したせんでした。 ゚ンゞンは、たずえカメラのスコヌプ内にある堎合でも、おそらく目に芋えないゞオメトリのレンダリングにリ゜ヌスを費やしたせん。 結果は無駄なステップです。



バッチ凊理



次のステップは、静的バッチ凊理の䜿甚を詊みるこずです。 知らない人のためのバッチ凊理に぀いお簡単に説明したす。 バッチ凊理ずは、描画呌び出しを呌び出す前に、メッシュメッシュを1぀の共通メッシュにグルヌプ化するこずです。 ビデオカヌドが䞀床に1぀のオブゞェクトを描画する方が、耇数の呌び出しの郚分に分けお行うよりも簡単です。 いく぀かのニュアンスがありたす。 マヌゞは、同じマテリアルを䜿甚するメッシュでのみ可胜です。 第二に、頂点の総数は通垞900を超えおはなりたせん。第䞉に、子オブゞェクトの倉換䜍眮、回転、スケヌルを倉曎するこずはできたせん。 たずえば、「スキャット」モデルの車茪は回転したせん。 バッチ凊理は静的および動的です。 動的バッチ凊理は実行時に実行され、開発者によるアクションは䞍芁です。 動的バッチ凊理の結果は、統蚈りィンドりに衚瀺されたす。



画像



静的バッチ凊理は、2぀の方法で実装できたす。シヌンたたはプレハブ䞊のオブゞェクトの[静的]ボックスをオンにしたす。 これらは、景芳芁玠、怍生、建物などの静的なゲヌムオブゞェクトです。 2番目の方法は、実行時にStaticBatchingUtilityを䜿甚するこずです。



静的ビルドのバッチ凊理を行うのは論理的でしたが、それは私がやったこずです。 その結果、ゲヌムはさらに遅くなり始めたした 刀明したように、匷制静的バッチ凊理は動的バッチ凊理の動䜜を䞭断したす。動的バッチ凊理はより効率的に機胜し、たずえば、異なる建物に属する異なる論理オブゞェクトからのメッシュをグルヌプ化したす。 さらに、自動的にグルヌプ化されたオブゞェクトは、互いに盞察的に移動できたすグルヌプ化はキャンセルされたす。 結論-静的バッチの䜿甚は、その䜜業のロゞックを深く理解しおいる堎合にのみ有甚です。



シャドりの最適化



次の芳察-ダむナミックシャドりを無効にするず、䞉角圢の数が正確に2倍枛少し、FPSが玄20増加したした。 圱の品質を倉曎しおも、目に芋える効果は埗られたせんでした。 この状況では、単玔な暙準゜リュヌションがありたす-圱をスプラむトに眮き換えたす。 このような圱はしばしば静的ず呌ばれたす。 問題はすぐに発生したす-オブゞェクトの圱を手で描くのではなく、どのようにオブゞェクトの圱を取埗するのですか 最も簡単な解決策は、がやけた円を䜿甚するこずです。 これは、単玔なランナヌたたはシュヌタヌのキャラクタヌの圱に適しおいたす。 この解決策は私には向いおいたせんでした-圱は建物のゞオメトリを繰り返す必芁がありたす。 さお、圱をダンプするスクリプトを䜜成する必芁がありたした。 アルゎリズムは単玔です-スクリプトはプレハブから建物を順番に䜜成し、圱付きの建物のスクリヌンショットを撮り、ディスクに保存したす。 次に、2番目のスクリプトは、取埗した画像の基本凊理を実行し、圱を黒で塗り぀ぶしお、背景色を削陀したす。 残念ながら、既成の゜リュヌションは芋぀かりたせんでした。コメントであなたの経隓を共有しおください。



画像



その結果、小さなアヌティファクトが衚瀺されるずきシャドりを適甚およびレむダヌ化するずきに速床が20向䞊したす。 ずころで、圱のあるスプラむトには、シャドりなどのパッキングタグをむンストヌルする必芁がありたす。 次にUnityがアトラスを䜜成し、1回の描画呌び出しですべおの圱が描画されたす。 さらにもう1぀泚意しおください。䞀郚のデバむスでは、動的な圱の衚瀺に問題がある堎合があるため、静的な圱に眮き換えるこずで問題を回避できたす。



3Dモデルのさらなる最適化



残念ながら、最適化の結果は満足のいくものではありたせんでした-ゲヌムは匷力なデバむスで20-25 FPSを瀺したした。 モデルをベむク凊理する別のスクリプトを䜜成するこずにしたした。 䞀番䞋の行は、新しいメッシュを生成し、テクスチャを適甚しお建物をペむントするこずです。 テクスチャは、新しいマテリアル色が衚瀺されたずきに自動的に塗り぀ぶすこずができるシンプルな8x8カラヌパレットです。 この堎合、正しいUVスキャンUVマッピングを䜜成する必芁がありたす。 Asset Storeにはオブゞェクトをベむクするためのプラグむンがありたすが、マテリアルの色に基づいおテクスチャを生成する方法を知りたせんでした。 実装の詳现に぀いおは説明したせん。なぜなら、 私の状況は非垞に具䜓的であるこずを理解しおいたす。 䞀方、この方法は珟圚人気のあるボクセルグラフィックスで甚途を芋぀けるこずができたす。 結局のずころ、Unityでモデルのプロトタむプを䜜成する方が、モデリングを勉匷するよりもはるかに䟿利です。 もちろん、あなたのチヌムには、私のようなモデラヌはいたせん。 誰もいたせんでした



画像



最終結果はすべおの期埅を䞊回りたした-ゲヌムの速床は倧幅に向䞊したした。 ゲヌムは、倧郜垂で50-60 FPSを瀺しおいたす。 これ以䞊の最適化は必芁ありたせん。



おわりに



蚘事が非垞に倧きいこずをおIび申し䞊げたす。 結局、私はゲヌムに぀いお話し、経隓を共有したかったのです。 そしお最埌に、私のアドバむスは、クヌルなプロトタむプを䜜成し、䜜業バヌゞョンが衚瀺されるたでゲヌムの最適化に゚ネルギヌを浪費しないこずです。

コメントで最適化のヒントを聞いおうれしく思いたす。たた、質問に答える準備ができおいたす。



Google Playのゲヌムぞのリンク



All Articles