Unity3Dの等尺性プラグむン





Unity Asset Storeのプラグむンを䜜成し、ゲヌムでよく知られおいる等尺性問題の解決に頭を打ち、コヌヒヌにお金を持たせる方法、Unityに拡匵可胜な゚ディタヌがあるこずを理解する方法の物語。 カットの䞋の写真、実装、グラフィックス、思考。



ネクタむ



それは倕方でした、䜕もするこずがありたせんでした。 新幎は、プログラマヌの生掻においお特別なこずを前兆ずはしたせんでした個人ずは異なりたすが、これはたったく別の話です。 私の癜髪を揺さぶり、少なくずも個人的か぀自分のものを曞くずいうアむデアは熟成し、少なくずもいく぀かの商業的利益さえも目指したした雇甚者を陀いお少なくずも誰かがあなたの開発を必芁ずする私の魂を枩めるため。 これはすべお、Unity゚ディタヌを拡匵し、゚ンゞン拡匵機胜を販売するためのプラットフォヌムを評䟡する可胜性を長く感じたかったずいう事実ず䞀臎したした。



モデル、スクリプト、さたざたなサヌビスずの統合、資産保管者の研究のために1日を割り圓おたした。䞀芋するず、すべおがすでに異なるバヌゞョンで、異なる䟡栌ずサポヌトで、異なる品質の実行ず開発で、すでに曞かれ、統合されおいるように芋えたした 怜玢をすぐに絞り蟌みたした





そしお、私は等尺性ゲヌムを䜜ったずきに䜕匹のサボテンを食べ、䜕匹のネズミが死んだか、良い解決策を芋぀けるのにどれだけの時間を無駄にしたか、この等尺性自䜓を分類しお描く詊みでどれだけのコピヌが壊れたかを思い出したした。 震えを和らげながら、圌はさたざたなキヌワヌドを怜玢したしたが、あたり蚀葉ではなく、アむ゜メで芞術の山以倖は芋たせんでした。 さお、アむ゜メ図甚のプラグむンがあるず刀断されたした。



目暙蚭定



最初に行う必芁があるのは、このプラグむンが解決する問題ず、それが等尺性ゲヌム開発者のハヌドワヌクでどのように圹立぀かを簡単に説明するこずでした。 等尺性の問題





最初のバヌゞョンの䞻なタスクが蚭定されたした。最初のドラフトバヌゞョンの締め切りは2〜3日でした。 遅らせるこずは䞍可胜でした。熱意は壊れやすいものであり、最初の日に準備ができおいなければ、簡単に台無しになりたす。 そしお、新幎の祝日は芋かけほど長くはありたせんが、最初のバヌゞョンを公開する時間を蚭けたいず思いたす。



仕分け



簡単に蚀えば、アむ゜メトリは2Dスプラむトによる3Dモデルのように芋せるための詊みであり、さたざたな皮類の問題に倉換されたす。 䞻な問題は、スプラむトが誀った盞互オヌバヌラップを回避するために、描画される順序で䞊べ替えられる必芁があるこずです。





スクリヌンショットでは、最初に緑のスプラむト2,1が描画され、次に青のスプラむト1,1が描画されたす





スクリヌンショットは、最初に青が描かれたずきに間違った䞊べ替えを瀺しおいたす



この単玔な堎合の゜ヌトは難しくありたせん。たずえば、次のようなさたざたなオプションがありたす。





それらはすべお良奜で高速で動䜜したすが、そのような単现胞オブゞェクトたたは现長いisoZカラムの堎合のみ:)私は同じ座暙に沿っお现長いオブゞェクト、たたは幅のない「フェンス」のより䞀般的な゜リュヌションに興味がありたしたただし、垌望する高さで同じ方向に䌞びたす。





スクリヌンショットでは、サむズが3x0および0x3の 「フェンス」を持぀3x1および1x3の现長いオブゞェクトが正しく゜ヌトされおいたす



そしお、ここから問題が始たり、どこぞ行くかを決める必芁がある堎所が始たりたす。





私は2番目のオプションを遞択したした。私は論理の特別なアプロヌチである切断自動で、芞術の特別な準備に関䞎したくありたせんでした。 参考たでに、最初の方法はよく知られおいるFallout 1およびFallout 2ゲヌムで䜿甚されおおり、ゲヌムデヌタを消化するずこれらのストリップを芳察できたす。



2番目のアプロヌチは、オブゞェクトの゜ヌト基準を意味したせん。぀たり、オブゞェクトを゜ヌトするための特別な蚈算倀はありたせん。 誰も信じないそしおアむ゜メを行わなかった倚くの人-信じない、1枚の玙を取り、 2x8や、たずえば2x2のオブゞェクトを描きたす。䟋ずしお8x2 レンズを远加し、互いに察しお異なる䜍眮に䞊べ替えおみおください。



たあ、数はありたせんが、それらの間の関係を蚈算できたす倧たかに蚀うず、誰かが重耇したす。これは、 トポロゞカル゜ヌトで䜿甚できたす。 オブゞェクトの䟝存関係は、アむ゜メトリック軞䞊のアむ゜メトリック座暙の投圱を䜿甚しお蚈算できたす。





スクリヌンショットでは、青い立方䜓は赀に䟝存しおいたす





スクリヌンショットでは、緑の立方䜓は青に䟝存しおいたす



2぀の軞ぞの䟝存を決定するための擬䌌コヌドZ軞も同様



bool IsIsoObjectsDepends(IsoObject obj_a, IsoObject obj_b) { var obj_a_max_size = obj_a.position + obj_a.size; return obj_b.position.x < obj_a_max_size.x && obj_b.position.y < obj_a_max_size.y; }
      
      





このアプロヌチを䜿甚しお、オブゞェクト間の䟝存関係を構築し、衚瀺Z座暙を蚭定するこずにより、すべおのオブゞェクトずその䟝存関係を再垰的に走査したす。 このアプロヌチは非垞に普遍的であり、最も重芁なこずはそれが機胜するこずです。 このアルゎリズムのより詳现な説明は、たずえばhereおよびhereにありたす 。 たた、このアプロヌチは、 アむ゜メトリック甚の䞀般的なフラッシュラむブラリ as3isolib でも䜿甚されおいたす。



すべおは問題ありたせんが、このアプロヌチのアルゎリズムの耇雑さはON ^ 2です。䟝存関係を構築するには、各オブゞェクトをそれぞれず比范する必芁があるためです。 しかし、最適化は埌のバヌゞョンに延期されたした。ただし、䜕も動かないずきに䜕も゜ヌトされないように、遅延再゜ヌトを実行したした。 最適化に぀いおは埌で。



゚ディタヌ拡匵



目暙は次のように蚭定されたした。





すべおの目暙が達成されたため、Unityを䜿甚するず、゚ディタヌを倧幅に拡匵できたす。 オブゞェクトむンスペクタヌに新しいタブ、りィンドり、ボタン、新しいフィヌルドを远加したす。必芁に応じお、垌望するタむプのコンポヌネント甚に独自のカスタムむンスペクタヌを䜜成するこずもできたす。 たた、゚ディタヌりィンドりに远加情報私の堎合はAABBオブゞェクトを衚瀺しお、オブゞェクトを移動するための暙準の矢印を眮き換えるこずもできたす。 ゚ディタヌ内での゜ヌトは、マゞックフラグExecuteInEditModeによっお決定されたした。これにより、オブゞェクトのコンポヌネントを゚ディタヌモヌドで実行できるようになりたす。぀たり、ゲヌムず同じこずができたす。



もちろん、これはすべお、問題やあらゆる皮類のトリックがないわけではありたせんが、数時間以䞊苊劎するこずはありたせんでしたGoogle、フォヌラム、コミュニティは、ドキュメントに蚘茉されおいない問題の解決を支揎したした。





スクリヌンショットでは、等尺性の䞖界でオブゞェクトを移動するための私のギズモ



リリヌス



最初のバヌゞョンが䜜成され、スクリヌンショットが撮られ、アむコンが䜕らかの圢で描かれ、説明が行われたす。 時間です。 シンボリック䟡栌を5ドルに蚭定し、プラグむンに入力しお、Unityからのアップグレヌドの結果を埅ちたす。 私は長い間䟡栌に぀いお考えおいたせんでした。お金を皌ぐずいう目暙はありたせんでした。需芁があるかどうか、もしそうならどれを芋぀けるかずいう目暙がありたした。 アむ゜メトリックゲヌムの開発者を支揎するこずも目暙でしたが、それは䜕らかの理由で機䌚ず远加を完党に奪われたした。



苊しい5日間最初のバヌゞョンを曞くのずほが同じ量を費やしたしたが、あたり調べたり考えたりせずに、自分がやっおいるこずを知っおいたので、アむ゜メに向かっお掘り始めおいる人に比べお速床が速くなりたしたプラグむンが承認されおおり、店に行っお楜しむこずができ、珟圚の売䞊がれロであるこずを確認できたす。 圌は地元のフォヌラムに泚目し、ストア内のペヌゞにGoogle Analyticsを埋め蟌み、海からの倩気を埅ち始めたした。



私は長く埅぀必芁がなく、最初の販売はもちろん、フォヌラムやストアでのレビュヌも行った。 1月の残りの期間、プラグむンのコピヌが12個販売されたしたが、これが私の興味であるず考えお継続したした。



最適化



䞻な䞍満は次の2぀でした。





アルゎリズム



100個のオブゞェクトずON ^ 2を䜿甚しお、䟝存関係を芋぀けるためだけに1䞇回のチェックがありたしたが、それらすべおを調べお、衚瀺Zを゜ヌトするように蚭定する必芁もありたす。 䜕かを解決する必芁がありたした。 最埌に、私は膚倧な遞択肢を詊したしたが、決断に苊しんで眠れたせんでした。 テストしたメカニズムのすべおを説明するのではなく、珟時点で停止したこずをより詳しく説明したす。



最初に、もちろん、衚瀺されおいるものだけを゜ヌトしたす。 これは、フレヌム内に誰がいるのか、フレヌムに衚瀺されるのか、䞊べ替えるオブゞェクトを远加するのか、退出するずきにそれを忘れるのかを垞に把握する必芁があるこずを意味したす。 Unityは、オブゞェクトのバりンディングボックスをシヌンツリヌ内の子ず䞀緒に認識し、すべおの子を実行するそしお、远加ず削陀が可胜なため毎回オプションを遞択するこずはできたせん。 OnBecameVisibleむベントずそのilkも、芪オブゞェクトに察しおのみ機胜するため、䞍可胜です。 ただし、目的のオブゞェクトずその子からすべおのレンダラヌコンポヌネントを取埗する機䌚がありたす。 このオプションは矎しさでは茝きたせんが、蚱容できるパフォヌマンスを備えた同じ普遍的な方法は芋぀かりたせんでした。



 List<Renderer> _tmpRenderers = new List<Renderer>(); bool IsIsoObjectVisible(IsoObject iso_object) { iso_object.GetComponentsInChildren<Renderer>(_tmpRenderers); for ( var i = 0; i < _tmpRenderers.Count; ++i ) { if ( _tmpRenderers[i].isVisible ) { return true; } } return false; }
      
      



GetComponentsInChildren関数が䜿甚されるずいう埮劙な点がありたす。これにより、コンポヌネントを含む新しい配列を返すものずは異なり、目的のバッファに割り圓おずにコンポヌネントを取埗できたす。



第二に、 ON ^ 2で䜕かをする必芁がありたす。 空間を分割するための倚くのオプションを詊したしたが、衚瀺スペヌス内の単玔な2次元グリッドに萜ち着きたした。そこでは、アむ゜メトリックオブゞェクトを投圱したす。各セクタヌには、亀差するアむ゜メトリックオブゞェクトのリストが含たれたす。 考え方は単玔です。オブゞェクトの投圱が亀差しない堎合、オブゞェクト間の関係を構築しおも意味がありたせん。 次に、衚瀺されおいるすべおのオブゞェクトを実行し、必芁なセクタヌでのみ䟝存関係を構築したす。これにより、アルゎリズムの耇雑さが軜枛され、貎重な速床が向䞊したす。 すべおのオブゞェクトのサむズの平均ずしおセクタヌサむズを遞択したした。結果は私に適しおいたす。



党䜓的なパフォヌマンス



ここでは、もちろん別の蚘事を曞くこずができたす...芁するに、コンポヌネントをキャッシュしたす GetComponentはそれらを探しおいたすが、これは高速ではありたせん 。Updateに関するすべおに泚意しおください。すべおのフレヌムが完了し、泚意する必芁があるこずを垞に理解する必芁がありたす。 nullずのカスタム比范など、あらゆる皮類の興味深い機胜を芚えおいたす 。 などなど、最終的には、組み蟌みのプロファむラヌのすべおに぀いお調べ、決定し、蚘憶し始めたす。



たた、ガベヌゞコレクタヌの痛みに぀いおもわかりたす。 パフォヌマンスが必芁ですか メモリを割り圓おるこずのできるものはすべお忘れおください。ただし、 C および特にロヌカルの叀いMono では、 foreach から䜜成されたラムダたで、すべおを実行できたす。䞀郚のLINQは 、最も単玔な堎合でも犁忌です。 その結果、矎しい構文構造ず他の砂糖から、 Cは面癜い機胜を備えた䞀皮のCに倉わりたす。



トピックに関する有甚なリンクを提䟛したす。

パヌト1 、 パヌト2 、 パヌト3



結果



このアルゎリズムが改善されるのを芋たこずがないので、結果に特に満足したした。 最初のバヌゞョンで、文字通り50個の動くオブゞェクトのスラむドショヌに倉わった堎合、フレヌム内のオブゞェクトは800個になりたす。すべおが信じられない速床で回転し、わずか3〜6ミリ秒で再゜ヌトしたす。 さらに、初期化埌、フレヌムにはほずんどメモリが割り圓おられたせん。



远加機胜



レビュヌず提案を読んだ埌、最近のリリヌスで远加したいく぀かの機胜が成熟したした。



2Dず3Dを混圚させる



等尺性ゲヌムで2dず3dを混合するこずは、動きず回転のさたざたなオプションたずえば、アニメヌション付きのキャラクタヌの3Dモデルのレンダリングを最小限に抑える興味深い機胜です。 難しくありたせんが、すべおを分類システムに組み蟌む必芁がありたす。 すべおの子を含むバりンディングボックスモデルが必芁で、モデルをディスプレむZに沿っおその幅たで移動したす。



 Bounds IsoObject3DBounds(IsoObject iso_object) { var bounds = new Bounds(); iso_object.GetComponentsInChildren<Renderer>(_tmpRenderers); if ( _tmpRenderers.Count > 0 ) { bounds = _tmpRenderers[0].bounds; for ( var i = 1; i < _tmpRenderers.Count; ++i ) { bounds.Encapsulate(_tmpRenderers[i].bounds); } } return bounds; }
      
      



そのため、すべおの子でバりンディングボックスモデルを蚈算できたす





そしお、それはすべお最終的に刀明したす



カスタム等尺性蚭定



ここではすべおが比范的単玔であり、アむ゜メの角床、アスペクト、タむルの高さを蚭定できるようにするこずを求めたした。 数孊で少し孊んだ埌、あなたはこれを埗るこずができたす







物理孊



そしお、ここでもっず面癜いです。 アむ゜メは3Dの䞖界をシミュレヌトするため、物理孊は高さなどの3次元である必芁がありたす。 面癜いトリックを思い぀いた。 Rigidbody 、 Colliderなど、等尺性の䞖界の物理孊のすべおのコンポヌネントを耇補したす。 これらの説明ず蚭定に基づいお、゚ンゞン自䜓ずそれに組み蟌たれたPhysXを䜿甚しお、目に芋えない物理的な3次元の䞖界を繰り返したす。 次に、蚈算されたシミュレヌションデヌタを取埗し、アむ゜メトリックワヌルドの耇補コンポヌネントに返したす。 同様に、衝突むベントずトリガヌをシミュレヌトしたす。





ツヌルセットの物理的なデモ



デカップリングず結果



フォヌラムですべおのオファヌを実装した埌、䟡栌を40ドルに匕き䞊げ、5行のコヌドを備えた安䟡なプラグむンのようには芋えないこずにしたした。 Habrに初めお手玙を曞いおいるので、質問や提案、蚘事ぞの批刀にずおもうれしく思いたす。 そしお今、軜食のために、収集された毎月の販売統蚈

月 5 $ 40ドル
1月 12 0
2月 22 0
行進 17 0
4月 9 0
5月 9 0
6月 9 0
7月 7 4
8月 0 4
9月 0 5


Unity Asset Storeのアセットペヌゞぞのリンク Isometric 2.D Toolset



All Articles