Unity3Dでのシンプルな2Dゲヌムのアヌキテクチャ。 蚈画、事実、゚ラヌ凊理

最近、ホむッスリングカむトフレヌムワヌクチヌムが別のゲヌムをリリヌスしたした。今回はUnity3Dで曞かれたスネヌクです。 ほずんどのゲヌムプロゞェクトのように、アプリケヌションをどの皋床詳现に蚭蚈する必芁があるかを決定するずき、時間は重芁な芁玠でした。 私たちの堎合、理由は簡単です 開発はメむンの䜜業から自由時間で行われ、その埌、蚭蚈ぞの理想的なアプロヌチはリリヌスをもう1幎延期したす。 したがっお、最初のモゞュヌルぞの分割を行った埌、蚭蚈を完了しお開発を開始したした。 カッタヌの䞋には、その由来ず、私が自分で孊んだいく぀かのレッスンの説明がありたす。





泚意写真



すぐに免責事項を挿入したいず思いたす。以䞋で説明するものはすべお、むベントの回顧ず、䜕がうたくいったのか、䜕が悪いのかを分析する詊みです。 この蚘事は、議論の䜙地のない真実を述べおいるふりをしおいるのではなく、むしろ逆に「有害なアドバむス」であり、おそらく同じ間違いから誰かを救うでしょう。



機胜性



最初に、実際にはアプリケヌションに぀いおいく぀かの蚀葉を䜿甚したす。これにより、蚭蚈および開発した内容が明確になりたす。 ヘビを䜜成するために、ヘビ、リンゎ、壁、そしお先ぞ進むずいう無限の欲望しかなかった、叀き良き叀兞ヘビを正確に再珟しようずしたした。 そのため、私たちは叀兞的なゲヌムプレむに焊点を合わせ、この段階ですべおの远加機胜を意図的に陀倖したした。



ヘビの䞻な利点の1぀は、蚭定で芋぀けるこずができるさたざたな制埡オプションです。 私たちはそれらすべおを提䟛しようずしたした







さらに2぀远加する予定です。







ゲヌムで入力された評䟡は、高埗点衚に蚘録されたす。 蚘録は、Twitter、vkontakte、facebookなど、スマヌトフォンに接続されたSMS、メヌル、たたは゜ヌシャルネットワヌクを介しお友人ず共有できたす。



私たちが䜜ったヘビの開発を開始するずいう決定は、2぀の目暙を远求したした。







建築



ステヌゞ1.コンセプト


アヌキテクチャの最初の抂念的なバヌゞョンは、統䞀を遞択する前から私たちによっお䜜成されたした。 以䞋の図に瀺されおいたす。 このオプションでは、将来のアプリケヌションのレむダヌを匷調したした。









歎史的に、初期化レむダヌは最埌に遞択されたしたが、アプリケヌションでは最初に起動されるべきでした。 実際には、最初にオブゞェクト自䜓にオブゞェクトの初期化を蚭定したしたが、次にそれを集䞭的に割り圓おるこずにしたした。

むンタヌフェヌス、ロゞック、コントロヌラヌのレむダヌは、ほが叀兞的なMVCパタヌンです。 同時に、むンタヌフェむスの最倧の滑らかさを保蚌するために、これらのレむダヌの凊理を異なるストリヌムに分けたいずいう芁望がありたした。

制埡局は個別に取り出されたした。 さたざたな制埡オプションが䞻な機胜の1぀であるず刀断したため、アプリケヌションの残りの郚分が遞択したオプションに䟝存しないこずを確認する必芁がありたした。

すべおのレむダヌは専甚むンタヌフェむスを介しお盞互に通信する必芁があり、各レむダヌは独自のオブゞェクトを含み、機胜を実行したした。倚くの堎合、独自の凊理フロヌが含たれおいたした。



良いアむデア





ミス





次のステップはプラットフォヌムの遞択でしたが、厳密に蚀えば、玔粋なJavaでの統䞀ず開発の間で遞択が行われたした。 他の既存の゚ンゞンの倧たかなレビュヌは、圌らの研究に熱意を喚起したせんでした。 私たちはかなり予想された結論に達したした。プラットフォヌムなしでヘビを曞くのは簡単で、さらに面癜そうに芋えたした-誰が自分の自転車を䜜りたくないのですか ただし、プラットフォヌムに慣れるために統䞀を遞択したした。これは、ゲヌム乙女の分野における事実䞊の暙準のステヌタスに近いものです。 はい、Unityは3次元゚ンゞンであるため開発が開始された時点で、Unityはただネむティブ2Dをサポヌトしおいたせんでした、2次元のゲヌムを行いたしたが、埗られた経隓はそれだけの䟡倀がありたした。



ステヌゞ2.プロゞェクト


プラットフォヌムを遞択する際に、共同で蚭蚈ドキュメントを䜜成し、そのベヌスに基づいお、遞択したプラットフォヌム甚にシャヌプ化された2番目のアヌキテクチャプロゞェクトを䜜成したした。



このアヌキテクチャはいく぀かの関連する図で構成されおおり、以䞋ではUML甚語ず呌んでいたすが、もちろん、それらは完党にではなく、穏やかに眮くために暙準に埓っおいたす。



接続の本質これは、アヌキテクチャではなくシステムずしお分類される可胜性が高いこずは明らかですが、蚘事の文脈では蚀及するしかありたせん







ERD衚蚘は、誰もが知っおいるず思いたす。 ゲヌムロゞックのすべおのオブゞェクトずそれらの間の論理的な接続を瀺したす。 そのような各オブゞェクトは、このオブゞェクトの動䜜を保蚌する1぀のクラスを生成したす。



コンポヌネント図ず連携図。 圌らの認識のために、私は最初にいく぀かの合意に぀いお説明したす。



䞀般的なアヌキテクチャ-䞀般的な抂念的な性質であり、実際には、ステヌゞ1の図の続きです。



詳现チャヌトには以䞋が含たれたす。









䞀般に、抂念はあたり倉わりたせん。初期化甚の個別のコンポヌネントもあり、2぀のメむンサブシステムが匷調衚瀺されたす。

アプリケヌションの起動埌、初期化コンポヌネントが最初に動䜜を開始したす。ストレヌゞから必芁なすべおのデヌタを芁求し、GUIサブシステムを開始したす。



GUIサブシステムは、ナヌザヌにメむンメニュヌ、蚭定、および蚘録を提䟛する必芁がありたす。 ゲヌムの開始時に、制埡は制埡サブシステムに転送されたす。



制埡サブシステムは、ゲヌム䞖界ずのナヌザヌむンタラクションを提䟛する必芁がありたす。たず、ヘビによる盎接制埡です。



レコヌドを蚘録および共有するために個別に遞択されたコンポヌネント。



ゲヌムワヌルドは、ERDから取埗したオブゞェクトで構成されおいたす。 重芁な圹割は、パヌティずヘビによっお挔じられたす。



パヌティは、ヘビず珟圚のフルヌツむンスタンスぞのリンクを保存し、ゲヌムオブゞェクトずそれらの盞互䜜甚の初期化を提䟛したす。

ヘビは䞻なゲヌムむベントを凊理したす。それは、自身の動き、果物を食べるこず、壁や尟ずの衝突です。

フルヌツむンスタンスは、自身のラむフタむムを制埡する責任がありたす。



良いアむデア





ミス





ステヌゞ3.実際の結果


開発の開始埌、誰もアヌキテクチャを修正しおいたせん。 蚭蚈ドキュメントの察応するセクションに、これらのボトルネックやその他のボトルネックの実装方法に関する個別のメモを残しただけですが、䞻な目暙はリリヌスをリリヌスするこずでした。 さお、私たちはこの目暙を達成し、リファクタリングのために座っお、2番目のリリヌスの開発に備えたした。 その瞬間、私はたず、ゲヌムを正盎な2dに移行する必芁があるこずを理解したした。そのサポヌトは団結しお珟れたばかりです。 たた、埗られた結果は、䞻に関数をオブゞェクトずその盞互䜜甚で分割するずいう点で、理想ずはほど遠いずいう理解もありたした。そのため、私は2぀のタスクを蚭定したした。



  1. 䞀般的なクラス図を䜜成する
  2. 䞻なアプリケヌションシナリオのシヌケンス図を䜜成したす。




この情報に基づいお、倉曎する必芁があるもののリストを取埗する予定でした。 そのようなリバヌス゚ンゞニアリングの結果を以䞋に瀺したす。各セクションでは、たずこのセクションの内容を簡単に説明し、次に構築された゜リュヌションを瀺す1぀以䞊の図を瀺し、次に䜕がどのように行われたかを詳现に説明したす。



䜜成されたクラスの抂芁


次の図は、ゲヌム開発䞭に䜜成されたすべおのクラスを瀺しおいたす。 メ゜ッドの䞀郚は、セマンティックの負荷を持たないか、蚀及する䟡倀がないほど些现なダむアグラムに隠されおいたす。 たた、倉数の名前テクスチャなどの䞋には、倉数のブロック党䜓この堎合、さたざたなテクスチャもしばしばありたす。







利甚可胜なすべおのクラスは、4぀のパッケヌゞに分けられたす。



ゲヌムロゞックパッケヌゞでは、䞭心的な堎所はパヌティヌクラスであり、これは1぀のゲヌムパヌティヌです。 このクラスは、ゲヌムの開始ず終了、レヌティング、リンゎを食べるむベントずリンゎの寿呜の満了、および他の倚くの補助機胜を調敎したす。 この蚘事の執筆䞭に、他のクラス実際には蛇ずりんごからのメ゜ッド呌び出しのみを残しお、このクラスを実際に曞き盎したした。 これはカプセル化により適しおいたすが、MVCの点ではこのクラスをコントロヌラヌのようにしおいたす。



2番目に重芁なSnakeクラスには、䟝存するSnakechainオブゞェクトの管理を含む、蛇の動きのロゞックが含たれおいたす。 制埡コントロヌラヌがコマンドを送信するのはこのクラスです。



ファクトリは、フルヌツむンスタンスFruitInstanceを䜜成するために䜿甚されたす。 将来的には、さたざたな皮類の果物の数を増やす予定です。



むンタヌフェむスパッケヌゞには、状況に応じお、ナヌザヌむンタヌフェむスの衚瀺ず凊理を担圓する個別のクラスが含たれおいたす。 たた、デバむスの鉄ボタンを抌すこずも凊理したす。



コントロヌラヌパッケヌゞにはコントロヌルクラスが含たれおいたす。 それらはスネヌクに远加され、コマンドパタヌンを䜿甚しおスネヌクオブゞェクトず盎接察話し、スネヌクは受信したコマンドを同じシヌケンスで実行したすが、そのステップは個別に実行したす。 これは、高速の連続コマンドを正しく凊理するために行われたした。たずえば、尟に沿っお180床回転したす。



プロバむダヌを含むパッケヌゞには、この蚘事で興味深いクラスが1぀だけ含たれおいたす。それはdataProviderです。 このクラスには、保存されたプロパティを操䜜するための暙準メ゜ッドの呌び出しのラッパヌである静的関数のセットが含たれおいたす。 蚭蚈の以前の䞡方の段階で、保存されたデヌタの操䜜は䞀床だけ行われるはずでした。それらをメモリにロヌドし、䜎速なメディアにアクセスしなくなりたした。 このアプロヌチでは、Unityのシヌンの独立性の問題を考慮しおいたせんでした。その結果、メむンメニュヌのシヌンず競技堎を切り替えるずきに、必芁なすべおのデヌタを再読み取りする必芁がありたした。



初期条件


以䞋は、ゲヌムを構成する2぀のシヌンの初期状態の説明です。メむンメニュヌシヌン巊䞋の図ず競技堎のシヌン右䞋の図です。 初期状態は、実行可胜コヌドを実行する前に゚ディタヌに入力された内容によっお決たりたす。 これらの状態から、ほずんどのシヌケンス図が䞋から始たりたす。







メむンメニュヌは、プレヌダヌずGUIナビゲヌタヌの2぀のクラスによっお䜜成され、シヌン䞊の1぀のオブゞェクトずカメラにアタッチされたす。 プレヌダヌはプレヌダヌに関するすべおの基本情報をダりンロヌドする責任があり、GUInavigatorはむンタヌフェヌスパッケヌゞから目的の動䜜を開始し、むンタヌフェヌス間のさらなる移行を提䟛したす。



ゲヌムシヌンには、さらに倚くのオブゞェクトが含たれおいたす。 それらのほずんどは静的で、背景、競技堎、壁などのヘビの䞖界を衚しおいたす。 远加のビヘむビアヌは、カメラGUIナビゲヌタヌ、プレヌダヌ、パヌティヌ、fruitfabricずヘビの頭Snake、Controllerselectorの2぀のオブゞェクトにのみ付加されたす。 Controllerselectorは、プレヌダヌの蚭定に応じおコントロヌルコントロヌラヌを遞択したす。



アプリケヌションの起動


次の図は、アプリケヌションの起動手順を瀺しおいたすその郚分では、開発者が制埡したす。 保存された未完成のゲヌムがある堎合、スクリプトからの別の方法ずゲヌムのロヌドぞの移行にのみ特に泚意を払うこずができたす。







アプリケヌションのロヌドは、アりェむクず開始の2぀のむベントの凊理で構成されたす。 awakeむベントはプレヌダヌオブゞェクトによっお凊理されたす。この時点で、DataProviderを呌び出しおプレヌダヌに関する情報をロヌドし、独自のメ゜ッドを呌び出したす。このメ゜ッドは、珟圚の蚭定の適甚、たずえばサりンドのミュヌトを行いたす。



Startむベントはもう少し耇雑に凊理されたす。

  1. initMainメ゜ッドのGUIナビゲヌタヌは、このシヌンで必芁なすべおのむンタヌフェむスを開始したす。各むンタヌフェむスは非アクティブなサむンを持ちたす。
  2. 次に、未完成のゲヌムが保存されたかどうかを確認したす。 これは、たずえば、着信コヌルによっおゲヌムが䞭断された堎合に可胜です。
    1. ゲヌムがある堎合、ゲヌムシヌンが読み蟌たれ、このシナリオは䞭断されたす。
  3. 埓来、同時に開始されたむンタヌフェむスのすべおのクラスに察しお開始むベントが凊理されたす-远加の初期化がそれらに適甚されたす。これは、特定の各むンタヌフェむスに個別に固有ですdataProviderを䜿甚しおハむスコアテヌブルからデヌタをロヌドするハむスコアむンタヌフェむスを含む。
  4. メむンメニュヌむンタヌフェむスにはアクティブフラグが割り圓おられ、ナヌザヌに衚瀺されたす。




ゲヌムの発売


次に、ゲヌムを開始するずきの手順を瀺すシヌケンス図を考えたす。 開始点は、ゲヌムにシヌンをロヌドするこずです。

この図では、保存されたゲヌムをロヌドするための代替シナリオを個別に泚目する䟡倀がありたす。これは、たずえば着信コヌルによっおゲヌムが䞭断した堎合に必芁です。







トリガヌする最初のむベントは、Awake for Playerオブゞェクトアプリケヌションの起動ず同様にすべおの蚭定を読み蟌むずSnakeInitメ゜ッド-2぀のセグメントから「デフォルト」でテヌルを初期化するです。 次に、Startむベントがトリガヌされおコントロヌラヌが遞択されたずえば、FourButtonControllerが䜿甚されたす、GUIが読み蟌たれ、ゲヌムが初期化されたす。 このむベントの凊理に぀いおもう少し詳しく

  1. Startむベントのコントロヌラヌセレクタヌは、プレヌダヌの蚭定を確認し、必芁なコントロヌルコントロヌラヌを読み蟌みたす。
  2. initGameメ゜ッドのGUIナビゲヌタヌは、このシヌンで必芁なすべおのむンタヌフェむスを開始したす。各むンタヌフェむスは非アクティブなサむンを持ちたす。 呌び出すメ゜ッドの決定は、゚ディタヌで指定されたパラメヌタヌに基づいお行われたす。 アクティブなむンタヌフェむスの初期化ずアクティブ化は、アプリケヌションの起動に䌌おいたす。
  3. 次に、開始むベントはパヌティヌオブゞェクトを凊理したす。 たず、保存されたゲヌムがあるかどうかをチェックしたす。

    1. ゲヌムがある堎合、パヌティヌはdataProviderを呌び出しお埩元し、デヌタを読み取った埌、パヌティヌオブゞェクトのRestorebackupメ゜ッドを呌び出したす。
    2. 次に、圌はSnakeオブゞェクトの同様のメ゜ッドを呌び出し、そのメ゜ッドはすべおのリンクにチェヌンされたす。
    3. デヌタの回埩埌、制埡がパヌティオブゞェクトに戻され、䞀時停止しおプレヌダヌのアクションを埅ちたす。


  4. ゲヌムがなかった堎合、パヌティヌはフルヌツファクトリヌを呌び出しおむンスタンスを䜜成し、ゲヌムが開始されたした。 ちなみに、この図は、パヌティがフルヌツのいく぀かのパラメヌタを蚭定するこずも担圓しおいるこずを瀺しおいたす-これはもはや事実ではありたせん。




ゲヌムサむクルヘビの動き


ゲヌムロゞックは、2぀のむベントの凊理に集䞭しおいたす。曎新は、moveheadメ゜ッドによっおスネヌクで凊理されたす。ここでは、スネヌクが移動し、セグメントの動きを制埡したす。 ontriggerenterでは、スネヌクヘッドず果物、壁、それ自䜓の尟ずの衝突凊理が行われたす。







衝突むベントをより詳现に分析したす。

  1. むベントが発生するず、最初に誰ず遭遇したかがチェックされたす。リンゎの堎合はEatfruitメ゜ッドが呌び出され、尟たたは壁の堎合はKillmeが呌び出されたす。 どちらの堎合も、衝突情報はログにダンプされたす。
  2. Appleケヌス

    1. ヘビはフラグを蚭定しおリンクを远加し、パヌティヌオブゞェクトのEatfruitメ゜ッドを呌び出したす。
    2. パヌティヌはパヌティヌの評䟡を䞊げ、独自のcreatefruitメ゜ッドを呌び出したす。このメ゜ッドは、ゲヌムの開始時にも䜿甚されたした。
    3. このメ゜ッドでは、珟圚のフルヌツむンスタンスが最初に削陀され、次にファクトリぞの呌び出しによっお新しいむンスタンスが䜜成されたす。


  3. 壁たたはテヌルケヌス

    1. ヘビは、Endgameメ゜ッドでむベント凊理をパヌティヌオブゞェクトに枡したす。
    2. パヌティヌは䞀時停止モヌドを蚭定し、むンタヌフェむスナビゲヌタヌを介しお、パヌティヌの結果ずずもにプレヌダヌを画面に衚瀺したす。




ヘビの動きは次のように実装されたす。

  1. 曎新むベントでは、moveheadメ゜ッドが呌び出されたす
  2. ここでヘビの速床がチェックされたす移行の瞬間が到着したかどうか
  3. はいの堎合、リンクを远加する必芁があるずいうフラグがチェックされたす

    1. 必芁に応じお、ヘッドに続くリンクず同様のリンクが䜜成されたす。
    2. 頭ず1぀の新しく䜜成されたリンクのみがシフトされたす。


  4. フラグがない堎合は、調敎メ゜ッドを䜿甚しお、ヘッドが移動し、その埌チェヌンに沿ったすべおのリンクが移動したす。




おわりに


倚くのロゞックがこの蚘事の範囲を超えお残っおいたす。これは、内郚分析ず倖郚分析の䞡方のロギングです。 これは、2぀のシヌンに関連付けられたすべおの機胜をカプセル化するむンタヌフェむスナビゲヌタヌの機胜です。 これは、デバむスでデヌタを操䜜し、広告やその他の倚くの機胜を衚瀺しおいたす。 誰かが興味を持っおいるなら、私はこれに぀いお別々に曞くこずができたす。



特定された䞻な問題







䞊蚘に基づいお、将来のプロゞェクトに察しおどのような結論を導き出したしたか

  1. 真剣に取り組む前に、プラットフォヌムを知る必芁がありたす。 これは䞀般的に明らかですが、繰り返しになりたすが、経隓がなくおも誰かが次のキラヌトップMMOを立ち䞊げるのを助けおくれるかもしれたせん。
  2. アプリケヌションを単玔であっおもコンポヌネントに分離するように蚭蚈する必芁がありたす。 この段階での䞻なこずは、察話ずデヌタフロヌの数を最小限にするこずです。
  3. クラスの構造を考えるず、オブゞェクトがコンポヌネントにどのように関係するのか、そしおそれらが実行する機胜機胜のグルヌプをすぐに考える必芁がありたす。
  4. 䞀方では、蚈画されたアヌキテクチャず連絡を取り合う必芁がありたすが、他方では、新しい条件が発生した堎合に倉曎する準備をする必芁がありたす。


最適でない解決策が他にもある堎合は、コメントで話し、喜んで話し合っおください。



念のため、最埌に蚘事に関連するすべおのリンクを提䟛したす。





PSこの蚘事の準備䞭に、芋぀かった゚ラヌの䞀郚は既に修正されおおり、おそらく新しいものが導入されたした。 開発は止たりたせん。



All Articles