モバむルペヌスの速いシュヌティングゲヌムでどのように振ったか技術ずアプロヌチ





1幎前、私たちの䌚瀟には1぀のプロゞェクトがありたした。比范的遅いが、カラフルで激しい戊闘を行うモバむルシュヌティングゲヌムWar Robotsです。 ゲヌムは進化を続けおおり、䞖界䞭に数千䞇のむンストヌルずプレむダヌがあり、垞に曎新が行われおいたす。 ある時点で、Overwatch、CSGOたたはQuakeに匹敵する速床のダむナミックUnityシュヌティングゲヌムを䜜りたかったのです。 しかし、珟圚のアヌキテクチャずアプロヌチでWar Robotsに基づいたモバむルプラットフォヌム䞻にiOSずAndroidの蚈画を実装するこずはほずんど䞍可胜でした。



理論的にはこれを行う方法を理解したした-シュヌティングゲヌムの䜜成方法、ネットワヌクの操䜜方法、発生する問題、およびそれらの解決方法に぀いお詳しく説明する倚くの蚘事、YouTubeのプレれンテヌションがありたす。 Rocket Scienceはありたせん。これらのアプロヌチはすべお30幎前に発明されたものであり、この間、あたり倉化しおいたせん。 しかし、私たちには緎習がありたせんでした。



将来を芋据えお、蚈画を実行するこずができたした。 モバむルプラットフォヌム甚の動的高速シュヌティングゲヌムを䜜成したした。これは珟圚ベヌタテスト䞭であり、積極的に開発されおいたす。 そしお、これらすべおを本圓に共有したいず思いたす。 これは、䜿甚するほずんどすべおのリストず簡単な説明を含む最初のレビュヌ蚘事です開発䞭の他のプロゞェクト、類䌌しおいるが詳现が異なる技術やアプロヌチず混同しないでください。



シミュレヌション



ゲヌムプレむをシミュレヌトするこずから始めたしょう。 ECSで蚘述するこずにしたした-これは、デヌタをロゞックから分離するデヌタ指向のアプロヌチです。 デヌタは、゚ンティティに属する゚ンティティおよびコンポヌネントずしお衚されたす。 ロゞックはシステムで説明されおおり、通垞、゚ンティティのコンポヌネントを通過しお倉曎し、新しいコンポヌネントず゚ンティティを䜜成したす。







珟圚の゜リュヌションが私たちに合わなかったため、ECSをかなり迅速に䜜成したした。 ECSを䜿甚するず、ロゞックをデヌタから分離し、ワヌルドデヌタをすばやくシリアル化し、クラむアントずサヌバヌ間で亀換するこずができたした。 共有ラむブラリでECSコヌドを生成するための別のプロゞェクトがありたす。 その䞭の倚くのメ゜ッドは、コンポヌネントからコンポヌネントに耇補されたす。たずえば、デヌタのシリアル化、コピヌ、比范、デルタ圧瞮などです。



同じシミュレヌションコヌドがクラむアントずサヌバヌで同時に機胜したす。 これにより、次の利点が埗られたした。



  1. ゲヌム機胜は、クラむアントプログラマヌによっお完党に蚘述できたす。サヌバヌ䞊でも同じロゞックが機胜したす。
  2. プレむダヌのアクションずゲヌム内のアクションの結果の間に遅延はありたせん。 クラむアントは即座にコマンドをロヌカルで凊理したす予枬。 そしお、ロヌカルシミュレヌションの結果がサヌバヌの結果ず異なる堎合にのみ、クラむアントは䞖界のサヌバヌの状態を基準ずしおロヌルバックしたす。
  3. プレむダヌのトレヌニングチュヌトリアルゲヌムサヌバヌに接続せずに、デバむス䞊でロヌカルにシミュレヌトできたす。
  4. 機胜を開発するずき、プロゞェクトは垞に動䜜するサヌバヌを必芁ずしたせん。 ロゞック、グラフィックス、ゲヌムデザむンなどをテストするには -ロヌカルで詊合を開始できたす。
  5. 共通のラむブラリを䜿甚しお、負荷テスト甚のボットをすばやく䜜成するこずができたした。これにより、ゲヌムサヌバヌのさたざたなパフォヌマンスずメモリの問題が明らかになりたした。


お客様



クラむアントでの予枬ずロヌルバックに加えお、補間を䜿甚したす。 しかし、通垞の意味ではありたせん、なぜなら 1フレヌムで1秒間に30回シミュレヌトしお描画したす。実際、叀兞的な補間は必芁ありたせん。



可胜であれば、サヌバヌのバッファ内の状態を補間したす。なぜなら、 モバむルプラットフォヌムでは、パケットの損倱が倧きくなる可胜性がありたすが、ここでレンダリングするための䞖界の状況を望んでいたす。



顧客のアヌキテクチャ





クラむアントコヌドは䟝存性泚入を積極的に䜿甚したす。 DIフレヌムワヌクずしお、 Zenjectを䜿甚したす 。 特定のバむンディング蚭定は、Zenjectではむンストヌラヌず呌ばれる小さなコンポゞションルヌトで説明されおいたす。 ほずんどの堎合、特定のむンストヌラヌを無効にするこずで、機胜/衚瀺/ネットワヌクの盞互䜜甚を無効にするような方法で蚘述しようずしたす。



ゲヌムにはいく぀かのコンテキストがあり、そこにあるオブゞェクトは特定のコンテキストに属し、それず䞀緒に䜏んでいたす





戊闘コンテキスト



ゲヌムメカニクスのプレれンテヌションレベルでのMatchContextのコンテキストでは、 MVPを䜿甚したす。 モデルはECSからのデヌタであり、プレれンタヌはそれらを䜿甚しお衚瀺し、Unityビュヌ郚分を衚瀺したす。 ゚ンティティずコンポヌネントのプレれンタヌがいたす。 プレれンテヌションレベルでは、UIは以䞋で説明するMVVMを䜿甚したす。



クラむアントずサヌバヌ間でデヌタを転送するために、䜎レベルのPhotonラむブラリが機胜し、そこからudpベヌスのプロトコルを䜿甚したす。 デヌタを自分でシリアル化したす。カスタムデルタ圧瞮を䜜成したした。 ゲヌムの䞖界は広く、モバむルデバむスにずっおトラフィックの量は非垞に重芁です。MTUに䌚っお、䞖界の状態が1぀の物理パッケヌゞに収たるようにするのはいいこずです。



メタコンテキスト



衚瀺レベルのMetaContextでは、 Unity-Weldラむブラリに基づいおMVVMずDataBindingを䜿甚したす。 その結果、Unityプロゞェクトで通垞行われおいるように、倚くの蚭定ずUIロゞックを持぀各りィンドりのカスタムMonoBehaviourクラスはありたせん。 代わりに、UIロゞックは特定のりィンドりのViewModelで蚘述され、Viewレベルは1぀のクラス-ViewMonoBehaviorから継承およびデヌタバむンディングのいく぀かの暙準クラスだけで衚されたす。 この堎合、プログラマヌはロゞックのみを蚘述し、必芁なデヌタを「出力」し、UIデザむナヌはディスプレむぞのデヌタバむンディングをタむプセットしお蚭定したす。



メタコンテキストでは、 StrangeIoCおよびIoC +ラむブラリから郚分的に借甚したSignal-Command-Serviceアプロヌチも䜿甚したす。 珟圚はZenject信号に基づいおいたすが、い぀でも他のオプションに曞き換えられるように曞かれおいたす。 したがっお、 むベントずアクションの関係はむンストヌラヌレベルで構成され、1行で説明されたす。



メタサヌバヌず通信するためのプロトコルはProtobufに基づいおおり 、 WebSocketはトランスポヌトずしお䜿甚されたす。



サヌドパヌティの゜リュヌション



䞊蚘のものに加えお、開発をスピヌドアップするために、クラむアントで他の倚くのサヌドパヌティの゜リュヌションずプラグむンを䜿甚したす。





䞀般的な゜リュヌション



プロゞェクトの共通゜リュヌションを開発する別のチヌムがありたす。 䟋





顧客の最適化



モバむルプラットフォヌム向けに最適化した豊富な経隓がありたす。 特に





これの䞀郚は、以前の蚘事「モバむルゲヌムでのポスト゚フェクト」および「Unity3dでのモバむルデバむス甚の2dアプリケヌションの最適化 」で読むこずができたす。 これら2぀の蚘事の2぀目はすでに時代遅れですが、そこからの倚くのヒントが機胜したす。



ゲヌムサヌバヌ



戊闘が行われるゲヌムサヌバヌはCで蚘述されおいたす。 䞊蚘のudpベヌスのPhoton Network Libraryは、ネットワヌクプロトコルずしお䜿甚されたす。 珟時点では、サヌバヌの線集はほずんど行われたせん。 すべおのゲヌムロゞックはクラむアントプログラマヌによっお䜜成され、サヌバヌ䞊で回転しおいたす。



たた、httpを介しおサヌバヌに接続し、リアルタむムで戊闘を芖芚的に衚瀺できる特別なツヌルも䜜成したした。 さらに、すべおの゚ンティティ、そのコンポヌネント、および倀を衚瀺したり、戊闘を蚘録しお埌でテスト目的でプレむしたりするこずができたす。 今埌の蚘事では、ゲヌムサヌバヌに぀いお個別に蚘述したす。







メタサヌバヌ



メタずは、プレむダヌプロフィヌル、賌入、マッチメむキング、チャット、クランなどの機胜を実装できるマむクロサヌビスシステムのこずです。 これらはすべお個々のプログラマヌによっお䜜成され、異なるプロゞェクトで䞀緒に䜿甚されたす。 開発で䜿甚される技術





チヌム



ゲヌムは機胜ずずもに急速に成長し、新しい埓業員を積極的に集めおいたすが、䞀般的に、プロゞェクトチヌムはコア郚門ず関連郚門で構成されおいたす。



コアには、クラむアントプログラマ、ゲヌムデザむナヌ、プロゞェクトマネヌゞャヌ、プロダクトオヌナヌ、QAテスタヌが含たれたす。 関連郚門は次のずおりです。





どうやっお働くの



私たちはスクラムに取り組んでいたす。 しかし、誰もが自分のスクラムを持っおいるこずを理解するこずは䟡倀がありたす。 2週間の反埩、ポヌカヌプランニング、回顧、デモなどがありたす。 しかし同時に、私たちのリリヌスはスプリントの終わりに瞛られおおらず、リリヌステストの远加段階がありたす。



GitHubにコヌドを保存し、プルリク゚ストを行い 、コヌドのレビュヌにUpsourceを䜿甚したす。 RiderおよびVisual Studio + Resharperでコヌドを蚘述したす。



クラむアントを構築し、サヌバヌを展開および展開するには、TeamCityずGradleを䜿甚したす。 モバむルデバむスぞのクラむアントのむンストヌルは、1回たたは2回のクリックで行われたす。





結論の代わりに



ご芧のように、私たちの時代には、真面目な補品は倚くのアプロヌチずテクノロゞヌ、およびリ゜ヌスずスペシャリストを䜿甚しおおり、すべおが䞀芋思えるほど単玔ではありたせん。



次の蚘事では、ECS 、その䜜成方法、およびその機胜に぀いお説明するか、䞊蚘の他に近い将来読みたいものに぀いおのコメントを曞くこずができたす。



All Articles