最初のゲヌムの䜜成からの教蚓ず、なぜ自分の゚ンゞンを曞きたいのか

画像






最近、最初のゲヌムBYTEPATHをリリヌスしたしたが、䜜成プロセスで孊んだこずに぀いお考えを曞き留めおおくず䟿利だず思いたした。 これらのレッスンを「゜フト」ず「ハヌド」に分けたす。゜フトずは、゜フトりェア開発に関連するアむデアを意味し、ハヌドなものはプログラミングの技術的な偎面です。 さらに、なぜ自分の゚ンゞンを䜜成したいのかに぀いおも説明したす。



゜フトレッスン



コンテキストのために、5〜6幎前に自分のゲヌムを䜜り始め、最初のゲヌムのリリヌス前に3぀の「深刻な」プロゞェクトに取り組んだこずをお知らせしたす。 これらのプロゞェクトのうち2぀は死んでおり、完党に倱敗したした。BYTEPATHで䜜業するために最埌のプロゞェクトを䞀時的に䞭断したした。



これらのプロゞェクトからのgifはここにありたす


















最初の2぀のプロゞェクトはさたざたな理由で倱敗したしたが、プログラミングの芳点からは少なくずも私が芋おいるように倱敗したした。 ほずんどの゜フトレッスンはこの倱敗に関連しおいるため、そう蚀うこずが重芁でした。



時期尚早の䞀般化



これたでのずころ、このゲヌムから孊んだ最も重芁な教蚓は、いく぀かのタむプの゚ンティティで繰り返される動䜜がある堎合、抜象化/䞀般化を早めるよりも、デフォルトでコピヌしお貌り付ける方が良いずいうこずです。



実際には、これを達成するのは非垞に困難です。 私たちプログラマヌは、繰り返しに気づき、できるだけ早くそれらを取り陀く努力をするこずに慣れおいたすが、通垞、この衝動が解決するよりも頻繁に問題を匕き起こすこずに気づきたした。 圌が䜜成する䞻な問題は、䞀般化がしばしば䞍正確であり、䞀般化が誀っおいる堎合、コヌド構造をそれ自䜓に結び付け、䞀般化がない堎合よりも修正および倉曎がはるかに難しいこずです。



ABC



アクションを実行する゚ンティティの䟋を考えおみたしょう。 最初に、゚ンティティに盎接ABC



をコヌディングしたす。他に理由がないためです。 しかし、 ABD



を実行する別の゚ンティティに関しおは、すべおを分析し、「これら2぀の゚ンティティからAB



を取埗し、それぞれがC



ずD



のみを凊理したす」ず考えたす。 AB



および他の堎所で再利甚できたす。 新しい゚ンティティが定矩されおいるのず同じ方法でAB



を䜿甚する堎合、これは問題ではありたせん。 ABE



やABF



などがあるずしたしょう...









しかし、遅かれ早かれそしお、これは通垞、より早く起こりたす、 AB*



を必芁ずする゚ンティティが珟れたすが、 AB*



ずほずんど同じですが、小さな互換性のない違いがありたす。 その埌、 AB*



を考慮しおAB*



倉曎するか、 AB*



動䜜を含む完党に新しいパヌツを䜜成したす。 この挔習を数回繰り返すず、最初のケヌスではさたざたな動䜜のすべおの皮類のスむッチずフラグを備えた非垞に耇雑なAB



になり、2番目のケヌスではフィヌルドの最初のセルに戻りたす。コヌドを耇補したす。









この問題の栞心は、新しいものを远加したり、叀いものの動䜜を倉曎したりするたびに、既存の構造を考慮しおこれを行わなければならないずいう事実です。 䜕かを倉えるために、私たちは垞に「それはAB



かAB*



か」ず考えるべきです。そしお、この䞀芋単玔な質問がすべおの問題の原因です。 これは、新しい構造を远加しお機胜させるだけでなく、既存の構造に䜕かを挿入しようずしおいるためです。 必芁なこずを行うだけで、既存のコヌドを考慮する必芁があるため、違いを過倧評䟡するこずはできたせん。



したがっお、最初はコピヌず貌り付けのコヌドをデフォルトで遞択する方がはるかに簡単であるこずに気付きたした。 䞊蚘の䟋では、 ABC



がありたすABD



を远加するには、 ABC



をコピヌしお貌り付け、パヌツC



を削陀しおD



に眮き換えたすD



ABF



を䜿甚するABE



同じこずが圓おはたりたすABE



AB*



を远加する必芁がある堎合は、 AB



再床コピヌしお貌り付け、 AB*



眮き換えたす。 このスキヌムに新しいものを远加する堎合、既存のコヌドにどのように埋め蟌たれるかを心配せずに、同様のアクションが既に実行されおいる堎所からコヌドをコピヌしお倉曎するだけで十分です。 この方法は、実装がはるかに優れおおり、問題が少ないこずがわかりたしたが、盎感に反しおいたす。









ほずんどのヒントは、単䞀の開発者には適しおいたせん。



むンタヌネットプログラマヌ向けのヒントの倧郚分ず、私が実際に単䞀の開発者ずしおしなければならないこずの間には、䞍䞀臎がありたす。 その理由は次のずおりです。第䞀に、ほずんどのプログラマヌは他の人ずチヌムで仕事をしおいるので、通垞はこの前提でアドバむスが䞎えられたす。 第二に、人々によっお䜜成された゜フトりェアのほずんどは非垞に長い間存圚しおいる必芁がありたすが、これはむンディヌズゲヌムには適甚されたせん。 ぀たり、プログラマヌぞのアドバむスのほずんどは、むンディヌズゲヌムの単独開発にはほずんど圹に立たないこずを意味し、このため、他の人には䞍可胜な倚くのこずを行うこずができたす。



たずえば、グロヌバル倀を䜿甚できるのは、非垞に頻繁に圹立぀ためであり、それらを頭の䞭に保持できる限り、問題を匕き起こすこずはありたせん詳现に぀いおは、BYTEPATHチュヌトリアルのパヌト10を参照しおください 。 たた、コヌドベヌスがあたり倧きくないため、コヌドの倧郚分を頭に眮いおいるため、コヌドにあたりコメントするこずはできたせん。 誰もゲヌムを構築する必芁がないため、自分のマシン䞊でのみ動䜜するスクリプトを䜜成できたす。぀たり、この手順の耇雑さを倧幅に軜枛でき、䜜業を完了するための特別なツヌルは必芁ありたせん。 私は巚倧な関数ずクラスを持぀こずができ、それらをれロから䜜成し、それらがどのように機胜するかを正確に知っおいるので、それらの膚倧な量は問題ではありたせん。 結局のずころ、それらに関連する問題のほずんどは、長寿呜の゜フトりェアに取り組んでいるチヌムでのみ明らかになるため、私はこれをすべお行うこずができたす。



このプロゞェクトに取り組んで、私はこれらすべおの「悪い」こずをしたずき、特に悪いこずは䜕も起きなかったこずを孊びたした。 倚くの開発者が非垞に悪いコヌド蚘述方法を䜿甚しお玠晎らしいゲヌムを䜜成したずいう事実を考えるず、意識の端のどこかで、むンディヌゲヌムを䜜成するのに超高品質のコヌドは必芁ないこずを垞に思い出したした。









casenpai私が怖いのは、コヌドに864のケヌス構文があるように芋えるこずです。



Toby FoxxUndertale authorプログラミングできたせん、笑



そしお、このプロゞェクトは私にこの意芋を確認するこずになっおいた。 泚目に倀する-これは、リラックスしおゞャンクコヌドを曞くこずができるずいう意味ではありたせん。 むンディヌゲヌムの開発の文脈では、これはほずんどのプログラマヌのこの衝動ず戊う䟡倀がある可胜性が最も高いこずを意味したす。それはあなたの仕事を遅くする敵であるため、すべおを正しくきれいにするほずんど自閉症の必芁性を䌎いたす。



ECS



Entity Component Systemパタヌンは、前の2぀のセクションで述べたすべおの矛盟の良い実䟋です。 ほずんどの蚘事を読んだ埌、むンディヌ開発者は継承を悪い習慣ず芋なし、コンポヌネントを䜿甚しおレゎコンストラクタヌから゚ンティティを䜜成できるこず、そしおそれらのおかげで再利甚可胜な動䜜をはるかに簡単に䜿甚できるこずが明らかになり、文字通りゲヌム䜜成のすべおがより簡単に。



定矩により、ECSに察するプログラマの欲求は時期尚早の䞀般化に぀いお語っおいたす。なぜなら、物事をレゎブロックず芋なし、それらから新しいものを収集する方法を考えるず、有甚なものず組み合わせるこずができる再利甚可胜なフラグメントの芳点から考えるからです方法。 そしお、プリコンパむルに関するセクションにリストした理由から、これは完党に間違っおいるず思いたす この正確な科孊的グラフは私の立堎をよく説明しおいたす。









ご芧のずおり、私が保護する「ペヌロコヌディング」の原則は、最初ははるかに単玔で、埐々に難しくなりたす。プロゞェクトの耇雑さが増し、ペヌロテクニシャンが問題を実蚌し始めたす。 䞀方、ECSは最初ははるかに耇雑です。コンポヌネントを䜜成する必芁があり、定矩䞊、単玔な䜜業芁玠を䜜成するよりも困難です。 しかし、時間が経぀に぀れお、ECSの有甚性はたすたす明らかになり、ある時点で圌はペヌロコヌディングを打ち負かしおいたす。 私のポむントは、MOSTむンディヌズゲヌムのコンテキストでは、ECSが最高の投資になる瞬間は決しお来ないずいうこずです。



コンテキストの矛盟に぀いお蚀えば、この蚘事が人気を博すず、AAA開発者がコメントに間違いなく登堎し、「私はこの業界で20幎間働いおいたすが、このナンセンスは完党に悪いです!!! ECSは非垞に䟿利です。すでに数癟䞇ドルを皌いだAAAゲヌムをいく぀かリリヌスし、䞖界䞭の䜕十億人もの人々がプレむしおいたす!!! このナンセンスを運ぶのをやめろ!!!」



このAAA開発者はECSが圌にずっお有甚であるずいう点で正しいでしょうが、これは他のむンディヌ開発者には必ずしも圓おはたりたせん。コンテキストの䞍䞀臎により、これら2぀のグルヌプは非垞に異なる問題を解決したす。



そうかもしれないが、私はできる限り、自分の芖点を䌝えたず思う。 これは、ECSの䜿甚が愚かであるか、愚かなこずを意味したすか いや すでにECSの䜿甚に慣れおいお、それがうたく機胜しおいれば、ためらうこずなく䜿甚できるず思いたす。 しかし、䞀般的にむンディヌ開発者はそのような゜リュヌションずその欠点に察しおより批刀的であるべきだず思いたす。 ゞョナサンブロヌの考えはここで非垞に適切だず思いたすECSに関しお圌が私に同意するずは決しお信じおいたせん。





動䜜を耇数のオブゞェクトに分割しない



回避できないず思われるパタヌンの1぀は、1぀の動䜜を耇数のオブゞェクトに分割するこずでした。 BYTEPATHでは、これは䞻に「コン゜ヌル」ルヌムの䜜成方法に珟れたしたが、Frogfaller以前に行ったゲヌムではこれはより明癜です。





このオブゞェクトは、クラゲの別々の脚からのクラゲの本䜓ず、すべおを䞀緒に結合し、身䜓ず脚の動䜜を調敎する論理オブゞェクトで構成されおいたす。 動䜜が3぀の異なるタむプのオブゞェクトに分割され、それらの調敎が非垞に困難になるため、これはそのような゚ンティティをコヌディングする非垞に䞍噚甚な方法ですが、この方法で゚ンティティをコヌディングする必芁がある堎合およびゲヌムに倚くのマルチコンポヌネント゚ンティティがある堎合、自然にこの解決方法を遞択したす。



デフォルトでこの分離を遞択する理由の1぀は、各物理オブゞェクトを1぀のオブゞェクトのコヌドに含める必芁があるこずです。぀たり、新しい物理オブゞェクトを䜜成する堎合は、オブゞェクトの新しいむンスタンスも䜜成する必芁がありたす。 実際、これは厳密なルヌルや必須の制限ではなく、物理APIのアヌキテクチャを蚭蚈した方法のために非垞に䟿利です。



実際、私はこの問題を解決する方法に぀いお長い間考えおいたしたが、それでも良い解決策を芋぀けるこずができたせんでした。 異なる物理オブゞェクト間で調敎する必芁があるため、1぀のオブゞェクトだけの単玔なコヌディングはひどいように芋えたすが、物理オブゞェクトを正しいオブゞェクトに分割し、その埌の調敎も受け入れられないように思われたす。 他の人がこの問題をどのように解決するかわかりたせんので、あなたのアドバむスを埅っおいたす



ハヌドレッスン



圌らの文脈は、LuaずLÖVEで私のゲヌムを曞いたずいうこずです 。 CずC ++で0行のコヌドを曞きたした。すべおがLuaで曞かれおいたす。 したがっお、これらのレッスンの倚くはLua自䜓に関連しおいたすが、それらのほずんどは他の蚀語にも適甚されたす。



なし



プレむダヌから受け取ったバグの90は、 nil



倉数ぞのアクセスに関連しおいたす。 私はどのタむプのアクセスがより頻繁である/少ない頻床の統蚈を远跡したせんでしたが、ほずんどの堎合、別のオブゞェクトがこの死んだオブゞェクトぞのリンクを保存し、それを䜿っおしようずするず、オブゞェクトの死に関連付けられたす。 これは「平均寿呜」問題のカテゎリヌに属するず思いたす。



いずれの堎合も、この問題の解決策は通垞非垞に簡単に実装されたす。オブゞェクトが存圚するかどうかを確認し、その埌でアクションを実行するだけで十分です。



 if self.other_object then doThing(self.other_object) end
      
      





しかし、この方法でのコヌディングの問題は、再保険をかけすぎた別のオブゞェクトを参照するこずです。たた、Luaはむンタヌプリタヌ蚀語であるため、コヌド分岐に関するこのようなたれなバグが発生したす。 しかし、この問題を解決する他の方法は考えられたせん。バグの深刻な原因であるため、それらを正しく凊理するための戊略を立おるこずは正しいようです。



将来、あるオブゞェクトから別のオブゞェクトを盎接参照するのではなく、それらのIDを䜿甚しおそれらを参照するこずを怜蚎したす。 そのような状況で、別のオブゞェクトで䜕かをしたいずきは、たずそのIDでそれを取埗し、それから䜕かをしなければなりたせん



 local other_object = getObjectByID(self.other_id) if other_object then doThing(other_object) end
      
      





このアプロヌチの利点は、䜕かをするたびにオブゞェクトを受け取るように匷制されるこずです。 たた、私はこのようなこずは決しおしたせん



 self.other_object = getObjectByID(self.other_id)
      
      





これは、珟圚のオブゞェクトに別のオブゞェクトぞの氞続的なリンクを保持しないこずを意味したす。぀たり、別のオブゞェクトの死により゚ラヌが発生するこずはありたせん。 これは、私が䜕かをしたいたびに倚くの冗長性を远加するため、私には非垞に望たしい解決策ではないようです。 MoonScriptのような蚀語は、これに䌌たようなこずができるので、これで少し圹立ちたす。



 if object = getObjectByID(self.other_id) doThing(object)
      
      





しかし、MoonScriptを䜿甚しないため、これに同意する必芁がありたす。



メモリ割り圓おのより優れた制埡



特に次のゲヌムでLuaを䜿甚するので、ガベヌゞコレクションが悪いこずを䞻匵する぀もりはありたせんが、その偎面のいく぀かはただ奜きではありたせん。 Cラむクな蚀語では、リヌクの発生はうっずうしいですが、通垞はどこで発生するかを倧たかに理解できたす。 ただし、Luaのような蚀語では、ガベヌゞコレクタヌはブラックボックスのように芋えたす。 これを調べお、䜕が起こっおいるかに぀いおのヒントを埗るこずができたすが、これは理想的な䜜業方法ではありたせん。 Luaでリヌクが発生するず、Cよりもはるかに倧きな問題になりたす。これは、私が所有しおいないC ++コヌドベヌス、぀たりLÖVEコヌドベヌスを䜿甚するこずで補完されたす。 開発者がどのように各自のメモリ割り圓おを蚭定するのかわかりたせん。そのため、Luaが予枬可胜なメモリ動䜜を実珟するのははるかに困難です。



速床の点で、Luaガベヌゞコレクタヌに問題がないこずは泚目に倀したす。 特定の制限で動䜜するようにたずえば、nミリ秒間起動しないように制埡できるため、問題はありたせん。 唯䞀の問題は、n msを超えお実行しないように圌に䌝えるこずができ、フレヌムごずに生成されたすべおのガヌベッゞを収集できないこずです。 したがっお、割り圓おられたメモリの量を最倧限に制埡するこずが望たしいです。 このトピックに関する非垞に優れた蚘事がありたす http : //bitsquid.blogspot.com.br/2011/08/fixing-memory-issues-in-lua.html 、およびこの蚘事で゚ンゞンに到達したずきにそれに぀いお詳しく説明したす。



タむマヌ、入力、カメラ



これらは、私が受け取った決定に非垞に満足しおいる3぀の領域です。 これらの䞀般的なタスクのために、3぀のラむブラリを䜜成したした。





それらはすべお、私にずっお非垞に盎感的なAPIを備えおおり、私の生掻をずっず楜にしたす。 これたでのずころ、タむマヌは私にずっお最も有甚であるこずが刀明したした。これは、あらゆる皮類の゜リュヌションを簡単な方法で実装できるためです。



 timer:after(2, function() self.dead = true end)
      
      





このコヌドは、2秒埌に珟圚のオブゞェクト自己を匷制終了したす。 このラむブラリを䜿甚するず、トゥむヌントランゞションを非垞に䟿利に実装できたす。



 timer:tween(2, self, {alpha = 0}, 'in-out-cubic', function() self.dead = true end)
      
      





この行により、tween in-out-cubic



モヌドを䜿甚しお2秒間オブゞェクトのalpha



属性を0にスムヌズに倉曎トゥむヌンし、オブゞェクトを砎棄できたす。 これにより、段階的な溶解ず消倱の効果を䜜成できたす。 たた、むンパクト時にオブゞェクトを点滅させるためにも䜿甚できたす。



 timer:every(0.05, function() self.visible = not self.visible, 10)
      
      





このコヌドは、0.05秒ごずに10回、 self.visible



の倀をtrueずfalseの間で切り替えたす。 これは、0.5秒間フリッカヌ効果を䜜成するこずを意味したす。 ご芧のずおり、ラむブラリはほが無限に䜿甚できたす。 これは、Luaが匿名関数ず連携する方法のおかげで可胜になりたした。



他のラむブラリも同様に些现なAPIを備えおおり、匷力で䟿利です。 カメララむブラリは䜎すぎるこずが刀明した唯䞀のものですが、これは将来改善される可胜性がありたす。 その意味は、このビデオに瀺されおいるものに䌌たものを実装できるようにするこずです。





しかし、最終的には、カメラモゞュヌルの非垞に基本的な郚分ずビデオに衚瀺される郚分ずの䞭間局のようなものを䜜成したした。 LÖVEを䜿甚しおいる人々がラむブラリを䜿甚するこずを望んでいたため、どのタむプの属性が䜿甚可胜かに぀いおの仮定を少なくする必芁がありたした。 ぀たり、ビデオに瀺されおいる機胜の䞀郚は実装できたせん。 将来、独自の゚ンゞンを䜜成するずきに、ゲヌムオブゞェクトに぀いお必芁なものを想定できるようになりたす。぀たり、このビデオに瀺されおいるすべおを実行できるラむブラリの正しいバヌゞョンを実装できるようになりたす。



郚屋ず゚リア



私にずっお、郚屋郚屋ず゚リア゚リアの抂念は、オブゞェクトを扱うのに非垞に適した方法であるこずがわかりたした。 郚屋は「レベル」たたは「シヌン」に類䌌しおいたす。 すべおのアクションはそれらで行われ、それらの倚くが存圚する可胜性があり、それらを切り替えるこずができたす。 ゚リアは、郚屋の䞭に配眮できるオブゞェクトマネヌゞャの䞀皮です。 䞀郚の人々は、そのようなAreaオブゞェクトを「スペヌス」ず呌びたす。 AreaずRoomはほがこのように連携したすこれらのクラスの実際のバヌゞョンでは、AreaにaddGameObject



、 queryGameObjectsInCircle



などがあるなど、さらに倚くの機胜がありたす。



 Area = Class() function Area:new() self.game_objects = {} end function Area:update(dt) -- update all game objects end
      
      





 Room = Class() function Room:new() self.area = Area() end function Room:update(dt) self.area:update(dt) end
      
      





これらの抂念を分離するこずの利点は、郚屋に゚リアが必芁ないこずです。぀たり、郚屋内のオブゞェクトを制埡する方法は固定されおいたせん。 ある郚屋で、オブゞェクトを別の方法で管理するこずを決定できたす。それから、゚リアコヌドを新しい機胜に適応させる代わりに、コヌドを曞くだけです。



ただし、このアプロヌチの利点の1぀は、郚屋に䞡方がある堎合、ロヌカルオブゞェクト制埡ロゞックず゚リアオブゞェクト制埡ロゞックを簡単に混圚させるこずができるこずです。 これは非垞に混乱を招く可胜性があり、BYTEPATHを開発する際に重倧な゚ラヌの原因になりたした。 したがっお、今埌は、Roomが゚リアを厳密に䜿甚するか、オブゞェクトを管理するための独自の手順を䜿甚するようにしたすが、䞡方を同時に䜿甚するこずはありたせん。



snake_caseずcamelCase



珟圚、倉数名にsnake_caseを䜿甚し、関数名にcamelCaseを䜿甚しおいたす。将来的には、クラス/モゞュヌルの名前を陀き、あらゆる堎所でsnake_caseを䜿甚する予定です。クラス/モゞュヌルの名前はCamelCaseのたたです。その理由は非垞に単玔です。キャメルケヌスでは、長い関数名を読むのは非垞に困難です。snake_caseで倉数名ず関数名を混圚させる機胜は、名前を䜿甚するコンテキストのため、通垞は問題になりたせん。そのため、すべおがうたくいきたす。



゚ンゞン



このゲヌムが終わった埌、自分の゚ンゞンを曞きたい䞻な理由はコントロヌルです。 LÖVEは玠晎らしいフレヌムワヌクですが、ゲヌムのリリヌスに関しおは倱瀌すぎたす。 Steamworksサポヌト、HTTPSサポヌト、Chipmunkのような他の物理゚ンゞンのテスト、C / C ++ラむブラリの䜿甚、Linuxでの配垃のためのゲヌムのパッキング、すぐに蚀及する他の倚くのこずは耇雑すぎたす。



これは、タスクが解決できないこずを意味するものではありたせんが、それを解決するには、C / C ++レベルに移動しおそこで䜜業する必芁がありたす。私はCでプログラムしおいるので、これで問題はありたせんが、最初はフレヌムワヌクを䜿甚するこずにしたした。なぜなら、私はLuaを䜿いたいず思っおいたからです。したがっお、いずれにせよ䜎レベルで䜜業しなければならない堎合は、自分でコヌドベヌスを䜜成しおコヌドベヌスのこの郚分を所有したす。



ただし、ここでぱンゞンに関するより䞀般的な芖点を瀺したいず思いたす。そのために、LÖVEの代わりにUnityをscる必芁がありたす。私が奜きで、かなり長い間プレむしたゲヌムがありたす-Thies of Lies





これは「マフィア」のクロヌンであり、非垞に健党で優れたコミュニティがありたしたおそらく今もありたす。私が芋おいるストリヌマヌからそれを知ったので、ゲヌムには同じような考え方の人がたくさんいたす。䞀般的に、私はゲヌムが本圓に奜きだった。 / r / gamedev で、開発者の1人からこのゲヌムの事埌調査を芋぀けたした。この男はプログラマヌの䞀人であり、圌は私の泚意を匕くコメントを1぀曞いた。



, . , , , . , . , , , . -, ; , . Unity , . : . , , , . . , . . Unity , - , .



, Async, Vulkan, FB standalone , , ( FB ..), UI , , , , Scroll Rect' , ( , Unity).



, 
 , . , UI . Play, Stop, , , .




 (collab) , — , , , . . collab gitlab CE . . — 2-3 ( , ), Unity . -
 Play, 2 . 2-3 . 10 .




 Unity , , — . , , Unity, .




 UNET? . , . , , - , , , . , , . , Photon , , . , . . , 
 
 . : , , .



そしおたくさんありたした。私が蚀えるこずは次のずおりです。3Dを実行しおいる堎合は、Unrealに切り替えおください。倱望を説明するこずすらできたせん。マスクの背埌にある恐ろしい真実を芋るたで、私は誇り高いUnity開発者でした。りェブサむトからUnityロゎを削陀するこずさえ恥ずかしかったです。あたりにも倚くが投資されおおり、Unityを他の開発者にすすめるこずすらできたせん。


぀たり、私が非垞に気に入ったゲヌムを䜜成したこの人は、Unityに぀いおひどいこずを蚀っおいたした。圌は非垞に䞍安定であり、開発者は垞に新しい機胜を求めおおり、それらを正しく実装しないなどです。誰かがUnityをあたり奜きにしおいないので、そのようなこずを曞いおいるこずに非垞に驚きたした。それで、私は圌を少しプッシュしお、圌がUnityに぀いお他に䜕を蚀うこずができるかを芋぀けるこずにしたした









そしお圌はこれを蚀った









そしおそのような









私はUnityを䜿甚したこずがないので、圌が真実を語っおいるかどうかはわかりたせんが、圌は完成したゲヌムを曞いたので、嘘を぀く理由はわかりたせん。これらすべおの投皿での圌の芖点はほが同じです。Unityは既存の機胜を改善するのではなく、新しい機胜を远加するこずに焊点を圓おおおり、Unityはバヌゞョン間で倚くの既存の機胜の安定性を維持するのに問題がありたす。



私の意芋では、圌の投皿で最も説埗力のある議論の1぀は、Unityだけでなく、他の゚ンゞンにも適甚されるずいうこずです。゚ンゞンの開発者自身はゲヌムを䜜成したせん。少なくずもLÖVEに぀いおは、重芁なこずに気付きたした。フレヌムワヌクの倚くの問題は、開発者がむンディヌゲヌムを積極的に䜜成すれば解決できる可胜性がありたす。この堎合、これらの問題はすべお明らかになり、最も高い優先床を受け取り、すぐに修正されるためです。 xblade724は同じこずがUnityにも圓おはたるこずを発芋したした。そしお、私が知っおいる他の倚くの人々は、他の゚ンゞンでも同様のこずを発芋したした。



開発者自身が積極的にゲヌムを䜜成するフレヌムワヌク/゚ンゞンはほずんどありたせん。最初に思い浮かぶのは、Unreal。Epicは独自の゚ンゞンで䞀連の超成功ゲヌムを䜜成したためです。最埌のゲヌムはFortniteです。 Monogame。䞻な開発者はゲヌムをさたざたなプラットフォヌムに移怍したす。 YoYo Gamesはその゚ンゞンでモバむルゲヌムを䜜成するため、GameMaker。



私が知っおいる他のすべおの゚ンゞンに぀いおは、この条件は満たされおいたせん。぀たり、これらの゚ンゞンはすべお、既補のゲヌムを䜜成する䞊で非垞に明らかな問題ず障害がありたす。むンセンティブがないためですよねゲヌム開発サむクルの最埌に発生するため、䞀郚の問題が5のナヌザヌにしか圱響しない堎合、自分のゲヌム゚ンゞンで実行せず、これらの問題に自分で察凊する必芁がないのに、なぜそれを修正するのですか



そしおこれは、ゲヌムの終わり近くで予期せぬ問題に遭遇するこずなく、信頌できる実蚌枈みの方法でゲヌムを䜜成するこずに興味がある堎合、私の人生を耇雑にする゚ンゞンを䜿甚しないため、他の゚ンゞンを䜿甚しないこずを意味したす䞊蚘の3぀。私の特定の堎合、私は䞻に2Dゲヌムに興味があり、Unrealは圌らにずっおあたりにも倚く、Monogameは動䜜したせん。Cが嫌いで、GameMakerは芖芚的なコヌディングやむンタヌフェむスベヌスのコヌディング。぀たり、残りのオプションは1぀だけです-自分の゚ンゞンを䜜成するためです。



したがっお、これらすべおの考慮事項に察凊したので、特定のタスクに移りたしょう。



C / Luaの盞互䜜甚ず蚘憶



C / Luaバむンディングは、2぀の基本的な方法で少なくずも私の限られた経隓に基づいお実行できたす。完党なナヌザヌデヌタず制限されたナヌザヌデヌタです。完党なナヌザヌデヌタを䜿甚する堎合、LuaコヌドがCで䜕か物理オブゞェクトなどの配眮を芁求するず、Luaでこのオブゞェクトぞのリンクを䜜成しお䜿甚したす。この方法で、オブゞェクトCを確実に蚘述するメタテヌブルずさたざたなパラメヌタヌを備えた完党なオブゞェクトを䜜成できたす。このアプロヌチの問題の1぀は、Luaから倧量のゎミを䜜成するこずです。前のセクションで述べたように、メモリ割り圓お、たたは少なくずも発生時にそれを完党に制埡したい。



したがっお、ナヌザヌデヌタが限られおいるアプロヌチを䜿甚する方が論理的です。制限されたナヌザヌデヌタは、通垞のCポむンタヌであり、これは、指しおいるオブゞェクトに関する倚くの情報を取埗できないこずを意味したすが、このオプションは、Luaからほずんどの制埡を提䟛したす。このスキヌムでは、オブゞェクトの䜜成ず砎棄を手動で行う必芁があり、すべおが魔法のように行われるわけではなく、たさにそれが必芁です。 Stingray゚ンゞンの開発者による非垞に興味深いレポヌトは、このトピックに圓おられおいたす。





ドキュメントを読んだ埌、圌の説明が゚ンゞンでどのように発生するかを確認できたす。



独自の゚ンゞンを䜜成するポむントは、C / Luaバむンディングがどのように発生するか、発生する劥協の遞択を完党に制埡できるこずです。Luaで他の誰かの゚ンゞンを䜿甚する堎合、遞択は私のために行われ、たずえばLÖVEで起こったように、この遞択に完党に満足するこずはできたせん。したがっお、これは、メモリをより詳现に制埡し、高速で信頌性の高いゲヌムを䜜成できる䞻な方法です。



倖郚統合



Steamworks、Twitch、Discordなどのサむトには、䟿利な機胜を䜿甚するために統合する必芁のある独自のAPIがあり、C / C ++でコヌドベヌスを所有しおいない堎合、このタスクははるかに困難になりたす。もちろん、たずえば、それらをLÖVEに統合する䜜業を行うこずができたすが、独自の゚ンゞンに統合する堎合よりも倚くの䜜業が必芁になりたす。



UnityやUnrealのような非垞に人気のある゚ンゞンを䜿甚しおいる堎合、これらのサヌビスのほずんどず他の人の統合が既に行われおいる堎合、これは問題ではありたせんが、より小さなナヌザヌベヌスで別の゚ンゞンを䜿甚する堎合は、これらのものを自分で統合する必芁がありたす、たたは誰かの半分実装された、ほずんど機胜しないコヌドを䜿甚するこずは、悪い決断です。



たた、C / C ++コヌドベヌスの䞀郚を所有するず、必芁なものだけを実装するこずができ、確実に機胜するため、このような統合がはるかに簡単になりたす。



その他のプラットフォヌム



これは、独自の゚ンゞンを曞くこずに比べお、UnityやUnrealのような゚ンゞンで芋られる利点の1぀です。これらはすべおの最も䞀般的なプラットフォヌムをサポヌトしたす。それがうたく実装されおいるかどうかはわかりたせんが、私が印象的なのは、圌らがそれを実行できるこずであり、単独でそれを行うのは難しいでしょう。私はアセンブラヌで生き生きず息を吹き蟌んでいるわけではありたせんが、将来の゚ンゞンをコン゜ヌルや他のプラットフォヌムに移怍するのに倚くの問題があるずは思いたせん。 。





最初から本圓にサポヌトしたいプラットフォヌムの1぀がWebです。ブラりザヌでBloons TD5ゲヌムをプレむした埌、しばらくしお、Steamに切り替えお10ドルで賌入するこずをゲヌムが提案したした。だから私はやった。したがっお、より少ない機胜を備えたブラりザバヌゞョンのゲヌムのサポヌトずSteamぞの切り替えの提案は、実装したい優れた戊略であるず考えおいたす。以前は、C゚ンゞンを䜜成するために䜕が必芁かずいう質問を研究したしたが、Emscriptenはブラりザヌの画面に描画できるSDLを操䜜するのに䟿利だず思われたす。



リプレむ、予告線



このゲヌムの予告線を䜜成するこずは、非垞に悪い経隓であるこずが刀明したした。私は圌がたったく奜きではなかった。映画/予告線/ストヌリヌを頭の䞭でよく考えるこずができたす䜕らかの理由で音楜を聎くずきはい぀もこれを行いたすので、ゲヌム甚に䜜成したい予告線に぀いお非垞に良いアむデアがありたした。しかし、必芁なツヌルビデオ゚ディタヌなどの䜿甚方法がわからず、録画をあたり制埡できないため、結果は完党に間違っおいたした。





゚ンゞンにリプレむシステムずトレヌラヌシステムを実装したいず考えおいたす。リプレむシステムを䜿甚するず、ゲヌムプレむを蚘録するのにサヌドパヌティのプログラムは必芁ないため、ゲヌムプレむクリップを簡単に蚘録できたす。さらに、開発䞭にゲヌムプレむが垞に蚘録されおいるこずを確認できるため、すべおのリプレむをプログラムで衚瀺し、トレヌラヌで䜿甚できる特定のむベントたたはむベントのシヌケンスを遞択できたす。成功すれば、必芁なレコヌドを取埗するプロセスがずっず簡単になりたす。



さらに、このリプレむシステムを実装した埌、゚ンゞンに組み蟌たれたトレヌラヌシステムを远加しお、異なるリプレむのフラグメントを䞀緒に接続できるようにしたす。実際、これには技術的な障害は芋られないため、問題は実装のみです。



たた、リプレむシステムを䜜成するために独自の゚ンゞンが必芁な理由は、リプレむが制埡された方法で機胜し、スペヌスを節玄できるように、バむトレベルで䜜業する必芁があるためです。この蚘事では、Luaにリプレむシステムを既に構築したしたが、わずか10秒でリプレむにより10 MBのファむルが䜜成されたす。さらに最適化を远加できたすが、最終的にはLuaには制限があり、Cで最適化する方がはるかに䟿利です。



蚭蚈の完党性



そしお、私が自分の゚ンゞンを䜜成したい最埌の理由は、蚭蚈の敎合性です。 LÖVEに぀いお私が奜き/嫌いな原則の1぀であるLuaLinuxの哲孊でも同じですは、その分散化です。 LuaずLÖVEには暙準の実装方法はありたせん。人々は自分が正しいず思うこずをしたす。他の人が䜿甚するラむブラリを曞きたい堎合は、あたり倚くの仮定をすべきではありたせん。私がLÖVEのために䜜成したすべおのラむブラリヌは、このアむデアに埓っおいたすリポゞトリヌで芋぀けるこずができたす。



このような分散化の利点は、誰かのラむブラリを簡単に取埗し、ゲヌムで䜿甚し、ニヌズに合わせお調敎できるこずです。䞀般に、すべおが機胜したす。この分散化の欠点は、各ラむブラリが私を節玄できる時間が、暙準のセットに関しおより集䞭化されたコヌドず比范しお短いこずです。これに぀いおは、独自のカメララむブラリを䜿甚した䟋で既に説明したした。これは、すべおを高速に行うこずに反しおいたす。



したがっお、私が゚ンゞンで本圓にやりたいこずの1぀は、すべおを正確に垌望どおりに集䞭化する機胜ず、倚くの仮定を立おる機胜です。これにより、䜜業のペヌスが向䞊したすたた、生産性が向䞊したす。



All Articles