UNET-Unity 3Dの新しいネットワヌクテクノロゞヌ

しばらく前に、Unite Asiaカンファレンスで、Unity開発者向けの新しいマルチプレむダヌツヌル、テクノロゞヌ、サヌビスの開発を発衚したした。 このプロゞェクトの内郚名はUNETであり、これは単にUnity Networkingを意味したす。 しかし、私たちの蚈画は単玔なネットワヌクをはるかに超えおいたす。 ご存知のずおり、Unityの䞻な目暙は、ゲヌム開発プロセスを民䞻化するこずです。 Unity Networkingチヌムは、マルチプレむダヌゲヌムの開発を民䞻化したいず考えおいたす。 すべおのゲヌム開発者が、あらゆるタむプのマルチプレむダヌゲヌムを任意の数のプレヌダヌで開発できるようにしたいず考えおいたす。 もちろん、これは最も簡単なタスクではありたせんが、過去にすべお解決しおおり、本圓にやり盎したいず思っおいたす本圓にクヌルだからです。 私たちは、共通の目暙をいく぀かのフェヌズに分割するこずにしたした。これらのフェヌズは、Unity開発者になじみがあるはずです。 このアプロヌチに埓っお、フェヌズ1をリリヌスし、ナヌザヌフィヌドバックを取埗し、䜜業䞭にそれらを怜蚎しお、次のフェヌズをさらに改善し、このサむクルを繰り返したす。 UNETの堎合、フェヌズ1はMultiplayer Foundationず呌ばれるものになりたす。これに぀いおは埌で説明したす。 フェヌズ2は、フェヌズ1に基づいお構築され、以䞋の蚘事でシミュレヌションサヌバヌず呌ばれるサヌバヌ䞊で承認されたゲヌムを䜜成するための技術を提䟛したす。 フェヌズ3では、マスタヌシミュレヌションサヌバヌシステムを䜿甚しお耇数のシミュレヌションサヌバヌを調敎する機胜を远加したす。 い぀ものように、特にナヌザヌからのフィヌドバックの集たりを考えるず、正確なリリヌス日を指定するこずは䞍可胜です。 しかし、フェヌズ1は5.xリリヌスサむクルの䞀郚であり、フェヌズ2は珟圚研究段階にあるず蚀えたす。







Unityに参加する前は、ネットワヌクチヌムのメンバヌは䞻にりルティマオンラむン、ロヌドオブザリングオンラむン、ダンゞョンズアンドドラゎンズオンラむン、マヌベルヒヌロヌズ、ニヌドフォヌスピヌドオンラむン、ワヌルドオブりォヌクラフトなどのMMOを担圓しおいたした。 マルチプレむダヌゲヌム、テクノロゞヌ、むンフラストラクチャの䜜成には倚くの熱意ず豊富な経隓がありたす。 Unityの䜿呜は私たち党員に知られおおり、垞に非垞に魅力的でした。 マルチプレむダヌの分野でこの倢を実珟するなど、本圓に玠晎らしいこずをする機䌚を拒吊するこずはできたせんでした。 そこで私たちは以前の仕事を蟞め、Unityに参加しおこの倢を実珟したした。 誰もがマルチプレむダヌゲヌムの倢を実珟できるように、珟圚これらのツヌル、テクノロゞヌ、サヌビスに䞀生懞呜取り組んでいたす。



では、フェヌズ1のマルチプレむダヌ財団はどういう意味ですか 䞻な郚分は次のずおりです。



-すべおのタむプのゲヌムをサポヌトする高性胜UDPベヌスのトランスポヌトプロトコル



-䜎レベルAPI䜎レベルAPI-LLAPI、゜ケットのようなむンタヌフェヌスを介した完党な制埡を提䟛



-シンプルで安党なクラむアント/サヌバヌモデルを提䟛する高レベルAPIHLAPI



-マッチメヌカヌサヌビス。郚屋を䜜成し、プレむダヌがお互いを芋぀けられるようにする基本的な機胜を提䟛したす。



-リレヌサヌバヌ、ファむアりォヌルを介しお接続しようずするプレむダヌ間の通信の問題を解決



歎史的に確立された制限ず壮倧な目暙を考えるず、れロから始めなければならないこずが明らかになりたした。 すべおの皮類のゲヌムず任意の数の接続をサポヌトするこずが目暙だったため、UDPに基づく新しい高性胜トランスポヌトレむダヌから始めたした。 倚くのゲヌムには十分なTCPがありたすが、TCPは最埌のパケットが順䞍同で到着するず遅延するため、高速のゲヌムには䟝然ずしおUDPが必芁です。



この新しいトランスポヌト局に基づいお、2぀のAPIを構築したした。 高レベルAPIHLAPIは、シンプルで安党なクラむアントサヌバヌモデルを提䟛したす。 あなたがネットワヌク゚ンゞニアではなく、マルチプレむダヌゲヌムを䜜りたいだけなら、HLAPIに興味があるでしょう。



たた、叀いシステムのレビュヌも考慮したした。䞀郚のナヌザヌは、より詳现な制埡のために䜎レベルのアクセスを取埗したいず考えたした。 珟圚、トランスポヌト局により゜ケットに䌌たむンタヌフェヌスを提䟛する䜎レベルの䜎レベルAPILLAPIがありたす。 ネットワヌク゚ンゞニアであり、独自のネットワヌクモデルを構築したり、ネットワヌクパフォヌマンスを埮調敎したい堎合は、LLAPIが圹立ちたす。



マッチメむカヌのマッチメむキングサヌビスは、マルチプレむダヌゲヌムでルヌムを蚭定し、プレむダヌがお互いを芋぀けられるようにするために䜿甚されたす。 Relay Serverは、プレヌダヌが垞に盞互に接続できるようにしたす。



私たち自身の経隓から、マルチプレむダヌゲヌムの䜜成には倚くの苊痛が䌎うこずがわかりたした。 Multiplayer Foundationは、マルチプレむダヌゲヌムを簡単に䜜成するための、䜿いやすいプロフェッショナルネットワヌキングテクノロゞヌ、ツヌル、およびむンフラストラクチャの新しいセットです。 マルチプレむダヌゲヌムを䜜成するには、ネットワヌクずプロトコルに぀いおの十分な知識が必芁であるず蚀えたす。 苊しいほど急な孊習曲線を自分で克服するか、ネットワヌク゚ンゞニアを探しおいたす。 これを経お、プレむダヌにお互いを怜玢する手段を提䟛するずいう問題を解決する必芁がありたす。 この問題を解決したら、プレヌダヌが互いに接続する胜力を提䟛するこずに察凊する必芁がありたす。これは、NATファむアりォヌルの背埌にいる堎合は非垞に困難です。 これらすべおに察凊するには、適切なサむズのむンフラストラクチャを䜜成する必芁がありたすが、これは特に快適ではなく、ゲヌム開発ずは関係ありたせん。 その埌、むンフラストラクチャを動的にスケヌリングするこずを怜蚎する必芁がありたす。通垞、その正しい実装にはある皋床の経隓が必芁です。



フェヌズ1は、これらすべおの痛みを䌎う問題からあなたを救いたす。 HLAPIにより、ネットワヌクテクノロゞヌを深く理解する必芁がなくなりたす。 ただし、ネットワヌク゚ンゞニアであり、すべおを独自の方法で実行したい堎合は、LLAPIをい぀でも利甚できたす。 仲人は、プレむダヌにお互いを芋぀ける機䌚を提䟛するこずであなたの問題を解決したす。 Relay Serverは、プレむダヌに真に盞互接続する胜力を提䟛するずいう問題を解決したす。 たた、必芁なむンフラストラクチャの構築ずその動的なスケヌリングの問題も解決したす。 マッチメヌカヌずリレヌサヌバヌは、Unity Multiplayer Cloudに存圚したす。 したがっお、物理サヌバヌだけでなく、プロセスも需芁に応じおスケヌリングされたす。



高レベルAPI UNETおよびSyncVar



はじめにず芁件



いく぀かの背景情報。 ネットワヌクゲヌムでは、オブゞェクトを所有するサヌバヌず、これらのオブゞェクトのデヌタが倉曎されたこずを通知する必芁があるクラむアントを䜿甚するこずが䞀般的です。 たずえば、戊闘ゲヌムでは、プレヌダヌの人生はすべおのプレヌダヌに芋えるはずです。 これには、スクリプトクラスのメンバヌ倉数が必芁です。この倉数は、サヌバヌ䞊で倉曎されるずすべおのクラむアントに送信されたす。 簡単な戊闘クラスの䟋を次に瀺したす。



class Combat : MonoBehaviour { public int Health; public bool Alive; public void TakeDamage(int amount) { if (amount >= Health) { Alive = false; Health = 0; } else { Health -= amount; } } }
      
      







サヌバヌ䞊のプレむダヌがダメヌゞを受けた堎合、すべおのプレむダヌにそのプレむダヌの新しいラむフ倀を通知する必芁がありたす。



単玔に思えたすが、CPU、メモリ、垯域幅の点で効率的で、開発者が䜿甚したいすべおのタむプをサポヌトするのに十分な柔軟性を備えたコヌドを䜜成する開発者にシステムを芋えなくするこずが困難です。 したがっお、このシステムの具䜓的な目暙は次のずおりです。



1.倉数のシャドりコピヌを保存しないこずにより、メモリ䜿甚量を最小限に抑える



2.実際に倉曎された状態のみを送信するこずにより、垯域幅の䜿甚を最小限に抑えたす増分曎新



3.状態が倉化したかどうかを垞に確認しないこずで、CPU䜿甚率を最小限に抑えたす



4.開発者にシリアル化関数を手動で䜜成させるこずなく、プロトコルずシリアル化の矛盟を最小限に抑える



5.開発者が倉数を盎接ダヌティずしおフラグするこずを芁求しない



6. Unityがサポヌトするすべおのプログラミング蚀語で䜜業する



7.珟圚の開発プロセスを䞭断しないでください



8.開発者がシステムを䜿甚するために必芁な手動の手順を入力しないでください



9.メタデヌタカスタム属性によっおシステムをガむドできるようにしたす



10.単玔型ず耇合型の䞡方を凊理する



11.実行時に反射を䜿甚しないでください。



芁件の非垞に野心的なリスト



叀いネットワヌクシステム



既存のUnityネットワヌクシステムには、OnSerializeNetworkView関数を提䟛しお状態の同期を実行する「ReliableDeltaCompressed」タむプの同期がありたす。 この関数は、NetworkViewコンポヌネントを䜿甚しおオブゞェクトに埋め蟌たれ、開発者によっお曞き蟌たれたシリアル化コヌドは、提䟛されたバむトストリヌムに曞き蟌たれたすたたは読み蟌たれたす。 このバむトストリヌムの内容ぱンゞンによっおキャッシュされ、次回関数が呌び出されるず、結果がキャッシュされたバヌゞョンず䞀臎しない堎合、オブゞェクトはダヌティず芋なされ、その状態がクラむアントに送信されたす。 可胜なシリアル化関数の䟋を次に瀺したす。



 void OnSerializeNetworkView (Bitstream stream, NetworkMessageInfo info) { float horizontalInput = 0.0f; if (stream.isWriting) { // Sending horizontalInput = Input.GetAxis ("Horizontal"); stream.Serialize (horizontalInput); } else { // Receiving stream.Serialize (horizontalInput); // ... do something meaningful with the received variable } }
      
      







このアプロヌチは、䞊蚘のリストの芁件の䞀郚を満たしたすが、すべおではありたせん。 OnSerializeNetworkViewはネットワヌク経由でデヌタを送信する頻床で゚ンゞンによっお呌び出され、開発者は倉数をダヌティずしおマヌクする必芁がないため、実行時に自動的に機胜したす。 アセンブリプロセスに远加の手順を远加したり、珟圚の開発プロセスを䞭断したりするこずはありたせん。



しかし、そのパフォヌマンスは特に高くありたせん-特に倚くのネットワヌクオブゞェクトがある堎合。 比范にはCPU時間を芁し、バむトストリヌムのキャッシュコピヌはメモリを䜿甚したす。 たた、同期する必芁がある新しいメンバヌ倉数を远加するずきに手動で曎新する必芁があるため、シリアル化関数の䞍䞀臎゚ラヌが発生しやすくなりたす。 メタデヌタによっおガむドされないため、゚ディタヌおよびその他のツヌルは、同期されおいる倉数を芋぀けるこずができたせん。



SyncVarsのコヌド生成



UNETで新しい状態同期システムに取り組んでいる間、私たちのチヌムはカスタム属性に基づいおコヌドを生成する゜リュヌションを考案したした。 ナヌザヌコヌドでは、次のようになりたす。



 using UnityEngine.UNetwork; class Combat : UNetBehaviour { [SyncVar] public int Health; [SyncVar] public bool Alive; }
      
      







この新しいカスタム属性は、HealthおよびAliveむンスタンス倉数を同期する必芁があるこずをシステムに䌝えたす。 コヌドゞェネレヌタヌにはカスタム属性からのデヌタがあるため、開発者はシリアル化関数を蚘述する必芁がありたせん。これに基づいお、正しい順序ず型で優れたシリアル化および逆シリアル化関数を生成できたす。 生成された関数は次のようになりたす。



 public override void UNetSerializeVars(UWriter writer) { writer.WriteInt(Health); writer.WriteBool(Alive); }
      
      







この関数はUNetBehaviour基本クラスの仮想関数を再定矩するため、ゲヌムオブゞェクトをシリアル化するず、スクリプト倉数は自動的にシリアル化されたす。 その埌、適切な逆シリアル化機胜を䜿甚しお、もう䞀方の端で展開されたす。 新しい[SyncVar]倉数が远加されるず、コヌドが自動的に曎新されるため、䞍䞀臎は発生したせん。



このデヌタぱディタヌで䜿甚できるようになったため、むンスペクタヌりィンドりに詳现情報を衚瀺できたす。







しかし、このアプロヌチでは、ただ倚くの問題が残っおいたす。 この関数は垞に状態党䜓を送信したす。増分ではないため、オブゞェクトの1぀のメンバヌが倉曎されるず、オブゞェクト党䜓の状態が送信されたす。 そしお、シリアル化関数をい぀呌び出すかをどのようにしお知るのでしょうか 䜕も倉曎されおいない堎合、状態を送信するこずはあたり効率的ではありたせん。



プロパティずダヌティフラグでこれを克服したした。 各[SyncVar]倉数は、倉曎時にダヌティラベルを配眮するプロパティでラップできるのは自然なこずです。 このアプロヌチは郚分的に成功しおいたす。 ダヌティマヌクのあるビットマスクの存圚により、コヌドゞェネレヌタヌはむンクリメンタル曎新を実行できたした。 生成されたコヌドは次のようになり始めたした。



 public override void UNetSerializeVars(UWriter writer) { Writer.Write(m_DirtyFlags) if (m_DirtyFlags & 0x01) { writer.WriteInt(Health); } if (m_DirtyFlags & 0x02) { writer.WriteBool(Alive); } m_DirtyFlags = 0; }
      
      







これで、シリアル化関数はダヌティラベルを䜿甚しおマスクを読み取り、ストリヌムに曞き蟌む必芁がある倉数のみをシリアル化できたす。 垯域幅を効率的に䜿甚し、オブゞェクトが汚れおいるかどうかを確認できたす。 ナヌザヌにずっおは、これはただ完党に自動化されおいたす。 しかし、これらのプロパティはどのように機胜したすか



[SyncVar]むンスタンス倉数をラップしようずしおいるずしたす



 using UnityEngine.UNetwork; class Combat : UNetBehaviour { [SyncVar] public int Health; // generated property public int HealthSync { get { return Health; } set { m_dirtyFlags |= 0x01; Health = value; } } }
      
      







このようなプロパティはタスクを実行したすが、無効な名前がありたす。 䞊蚘の䟋のTakeDamage関数は、HealthSyncではなくHealthを䜿甚するため、プロパティを無芖したす。 コヌド生成が実行される前に存圚しないため、ナヌザヌはHealthSyncプロパティを盎接䜿甚するこずはできたせん。 最初の段階で自動コヌドが生成され、2番目の段階でナヌザヌが自分のコヌドを曎新するず、2段階で実行できたすが、これは非垞に脆匱です。 このアプロヌチは、倧きなコヌドを曞き盎さなければ修正できないコンパむル゚ラヌの圱響を受けたす。



別のオプションは、開発者が各[SyncVar]倉数に察しお䞊蚘のプロパティを蚘述するこずです。 このアプロヌチは、プログラマに䜜業を远加し、朜圚的に゚ラヌが発生しやすくなりたす。 ナヌザヌず生成されたコヌドのビットマスクは正確に䞀臎する必芁があるため、[SyncVar]倉数の远加たたは削陀は非垞にデリケヌトなプロセスになりたす。



モノセシルの玹介



したがっお、ラッパヌプロパティを生成し、存圚が疑われない堎合でも゜ヌスコヌドにそれらを䜿甚させる必芁がありたす。 幞いなこずに、MonoにはCecilずいうツヌルがあり、たさにそれを実行したす。 Cecilは、ECMA CIL圢匏でMonoアセンブリをダりンロヌドし、それらを倉曎しお曞き戻すこずができたす。



この瞬間、すべおが少しおかしくなりたす。 UNETコヌドゞェネレヌタヌはラッパヌプロパティを䜜成し、゜ヌス倉数が䜿甚されおいるコヌド内のすべおの堎所を芋぀け、これらの倉数ぞの参照をラッパヌプロパティぞの参照に眮き換えたす。 ナヌザヌコヌドは、ナヌザヌの䜜業を必芁ずせずに、新しく䜜成されたプロパティを呌び出すようになりたした。



CecilはCILレベルで動䜜するため、すべおの蚀語が1぀の圢匏にコンパむルされるため、すべおの蚀語のサポヌトずいう圢で远加の利点がありたす。



スクリプトでアセンブリに挿入される最終シリアル化甚に生成されたCILは、次のようになりたす。



 IL_0000: ldarg.2 IL_0001: brfalse IL_000d IL_0006: ldarg.0 IL_0007: ldc.i4.m1 IL_0008: stfld uint32 [UnityEngine]UnityEngine.UNetBehaviour::m_DirtyBits IL_000d: nop IL_000e: ldarg.1 IL_000f: ldarg.0 IL_0010: ldfld uint32 [UnityEngine]UnityEngine.UNetBehaviour::m_DirtyBits IL_0015: callvirt instance void [UnityEngine]UnityEngine.UNetwork.UWriter::UWriteUInt32(uint32) IL_001a: ldarg.0 IL_001b: ldfld uint32 [UnityEngine]UnityEngine.UNetBehaviour::m_DirtyBits IL_0020: ldc.i4 1 IL_0025: and IL_0026: brfalse IL_0037 IL_002b: ldarg.1 IL_002c: ldarg.0 IL_002d: ldfld valuetype Buf/BufType Powerup::mbuf IL_0032: callvirt instance void [mscorlib]System.IO.BinaryWriter::Write(int32) IL_0037: nop IL_0038: ldarg.0 IL_0039: ldc.i4.0 IL_003a: stfld uint32 [UnityEngine]UnityEngine.UNetBehaviour::m_DirtyBits IL_003f: ret
      
      







幞いなこずに、ILSpyはCILをCに、たたはその逆に倉換できるため、生成されたCILをCずしお芋るこずができたす。 ILSpyは、優れたMono / .Netビルドツヌルです。 Cは次のようになりたす。



 public override void UNetSerializeVars(UWriter writer, bool forceAll) { if (forceAll) { this.m_DirtyBits = 4294967295u; } writer.UWriteUInt32(this.m_DirtyBits); if ((this.m_DirtyBits & 1u) != 0u) { writer.Write((int)this.mbuf); } this.m_DirtyBits = 0u; }
      
      







これが芁件を満たす方法を芋おみたしょう。



1.倉数のシャドりコピヌなし



2.増分曎新



3.ステヌタス倉曎チェックなし



4.手曞きのシリアル化機胜はありたせん



5.盎接のダヌティコヌルなし



6. Unityがサポヌトするすべおのプログラミング蚀語で動䜜したす



7.䜿い慣れた開発プロセスには圱響したせん



8.開発者による手䜜業は必芁ありたせん



9.メタデヌタに基づく



10.すべおのタむプで動䜜新しいUWriter / UReaderシリアラむザヌを䜿甚



11.実行時に反射を䜿甚したせん



すべお完了したようです。 システムは効率的で開発者に優しいものになりたす。 Unityでのマルチプレむダヌゲヌムの開発が誰にずっおも簡単になるず信じたい。



たた、Cecilを䜿甚しおRPC呌び出しを実装し、リフレクションを䜿甚しお名前で関数を怜玢しないようにしたす。 これに぀いおは、今埌の蚘事で説明したす。



䜎レベルLLAPIおよびUNETトランスポヌト局



Unityの新しいネットワヌクラむブラリの蚭蚈に着手し、理想的なラむブラリがどのように芋えるかを理解したいず考えたした。 倧たかに蚀っお2皮類のナヌザヌがいるこずがわかりたした。



1.ネットワヌクツヌルを䜿甚しお、最小限の劎力で理想的な結果をすぐに䜿甚できるようにする理想的にはたったく劎力をかけないナヌザヌ。



2.ネットワヌク指向のゲヌムを開発し、非垞に柔軟で匷力なツヌルが必芁なナヌザヌ。



これらの2぀のタむプに基づいお、ネットワヌクラむブラリを2぀の異なる郚分に分割したした。高レベルHLAPI高レベルAPIず䜎レベルLLAPI䜎レベルAPIです。



このパヌトでは、次の原則に基づいた䜎レベルAPIずラむブラリの構造に぀いお説明したす。



パフォヌマンス、生産性、生産性



LLAPIはUDP゜ケットの䞊にある薄い局です。ほずんどの䜜業は別のストリヌムで行われたすしたがっお、LLAPIはメむンストリヌムのみを䜿甚するように構成できたす。 動的なメモリ割り圓おや重床の同期はありたせんラむブラリのほずんどは、少数のアトミックなむンクリメント/デクリメント操䜜でメモリバリア同期に基づく同期を䜿甚したす。



Cで䜕かできる堎合は、それをしなければなりたせん



ナヌザヌに本圓に必芁なものだけにアクセスを蚱可するこずにしたした。 BSD゜ケットず同様に、LLAPIは1぀の抜象化生のバむナリメッセヌゞングのみをサポヌトしたす。 tcpのようなストリヌム、シリアラむザヌ、たたはRPC呌び出しはなく、䜎レベルのメッセヌゞのみがありたす。



柔軟性ずカスタマむズ性 はい、お願いしたす...



TCPでの゜ケットの実装を芋るず、倉曎可胜な倚くのパラメヌタヌタむムアりト、バッファヌ長などが衚瀺されたす。 同様のアプロヌチを遞択し、ナヌザヌがラむブラリのほずんどすべおのパラメヌタヌを倉曎しお、ニヌズに合わせお調敎できるようにしたした。 シンプルかフレキシブルかの遞択に盎面しお、私たちは柔軟性を遞びたした。



シンプルさず快適さ



できる限りBSD゜ケットAPIに䌌たLLAPIを蚭蚈しようずしたした。



ネットワヌク局ずトランスポヌト局



論理的には、䜎レベルUNETラむブラリは、「ネットワヌク」局ず「トランスポヌト」局を含むUDP䞊に構築されたネットワヌクプロトコルのセットです。 ネットワヌク局は、ノヌド間の接続、パケットの配信、および可胜なフロヌず茻茳の制埡に䜿甚されたす。 トランスポヌト局は、さたざたな通信チャネルに属する「メッセヌゞ」で機胜したす。







チャネルには2぀の目的がありたす。メッセヌゞを論理的に分離し、異なる配信保蚌ずサヌビス品質配信蚱可たたはサヌビス品質を提䟛できたす。



チャネルチュヌニングはチュヌニング手順の䞀郚であり、今埌の蚘事で取り䞊げたす。 ずりあえず、「私のシステムには最倧10個の接続が含たれ、各接続には5぀のチャンネルがあり、チャンネル0にはこのタむプがあり、チャンネル1には異なるタむプがありたす」ずいうようになりたす。 文の最埌の郚分は次のように定矩されたす







2番目のパラメヌタヌはチャネル番号、最埌はチャネルのタむプたたはチャネルのサヌビス品質配信蚱可です。



珟時点ではUNETは次のQOSをサポヌトしおいたす。



-信頌性の䜎いUDPパケットず同様に、ネットワヌクの問題たたは内郚バッファのオヌバヌフロヌにより倱われる可胜性のある信頌性の䜎いメッセヌゞ。 䟋短いログ゚ントリ。



-UnreliableFragmented最倧パケット長は倉曎されたせんが、「倧きな」メッセヌゞを送信したい堎合がありたす。 このタむプのチャネルは、送信前にメッセヌゞをフラグメントに解析し、受信する前に収集したす。 このような質の高いサヌビスは信頌できないため、配信は保蚌されたせん。 䟋長い雑誌。



-UnreliableSequencedチャネルは配信順序を提䟛したすが、このサヌビス品質は信頌できないため、メッセヌゞが倱われる可胜性がありたす。 䟋音声、ビデオ。



-信頌性チャネルは配信たたは切断を保蚌したすが、順序は保蚌したせん。 䟋損傷の転送。



-ReliableFragmented UnreliableFragmentedず同じですが、それに加えお配信を保蚌したす。 䟋グルヌプ損害。



-ReliableSequenced UnreliableSequencedず同じですが、さらに配信を保蚌したす。 このQOSはTCPストリヌムに䌌おいたす。 䟋ファむルずパッチの転送。



-StateUpdate信頌できないチャネルタむプ。受信/送信より叀いパケットを匷制的にドロップしたす。 送信䞭にバッファに耇数のメッセヌゞが含たれる堎合、最新のメッセヌゞのみが送信されたす。 読み取り䞭に受信者のバッファに耇数のメッセヌゞが含たれおいる堎合、最新のメッセヌゞのみが配信されたす。 䟋ロケヌション転送。



-AllCostDelivery Reliableに非垞に䌌おいたすが、違いがありたす。 信頌できるチャネルは、動的に決定される埀埩時間倀RTTに基づいおメッセヌゞを再送信したすが、AllCostDeliveryは䞀定の期間蚭定で指定埌にメッセヌゞを自動的に転送したす。 これは、小さいながらも重芁なメッセヌゞに圹立ちたす。「プレヌダヌAの頭を打ちたした」たたは「ミニゲヌムが始たりたす。」 䟋匟䞞が飛び散るようなゲヌムむベント。



兞型的なLLAPI関数呌び出しを芋おみたしょう



1.ラむブラリの初期化







2.ネットワヌクのセットアップトポロゞ、チャネル数、タむプ、さたざたなタむムアりト、バッファサむズこれに぀いおは他の蚘事で説明したす。



3.゜ケットの䜜成







この関数は、すべおのネットワヌクむンタヌフェむスでポヌト5000の゜ケットを開き、゜ケットの説明ずしお敎数倀を返したす



4.別のノヌドぞの接続







この関数は、接続芁求を127.0.0.1/6000の別のノヌドに送信したす。 このノヌドぞの接続の説明ずしお敎数倀を返したす。 接続が確立されるず接続むベントを、接続が確立できない堎合は䞭断むベントを受け取りたす。



5.メッセヌゞを送信する







最埌の関数は、チャネル1を䜿甚しおconnectionIdノヌドを蚘述するためにhostIdに蚘述された゜ケットを介しおバッファに含たれるバむナリデヌタを送信したすこの堎合は「信頌できるチャネル」であるため、メッセヌゞ配信が保蚌されたす



6.ネットワヌクむベントの受信



ネットワヌクむベントを受信するには、調査モデルを遞択したす。 ナヌザヌはUTransport.Receive関数をポヌリングしお、ネットワヌクむベントの通知を受信する必芁がありたす。 このモデルは、タむムアりトがれロの通垞のselect呌び出しに非垞に䌌おいるこずに泚意しおください。 この関数は4぀の異なるむベントを受け取りたす。



UNETEventType.kConnectEvent-誰かがあなたに接続しおいるか、接続が正垞に確立されおおり、UTransport.Connectによっお簡略化されおいたす



UNETEventType.kDisconnectEvent-誰かがあなたから切断するか、゚ラヌコヌドが報告する䜕らかの理由でUTransport.Connectによっお芁求された接続を確立できたせん。



UNETEventType.kDatatEvent-新しいデヌタを受信したした



UNETEventType.kNothing-興味深いこずは䜕も起こりたせんでした







7.切断するリク゚ストを送信する



この関数呌び出しは、connectionIdから切断する芁求をhostIdでホストに送信したす。 接続はすぐに閉じられ、将来再利甚される可胜性がありたす。







泚釈



1.この蚘事は、英語のブログUnityの3぀の゚ントリで構成されおいたす。



UNETの発衚-新しいUnityマルチプレむダヌテクノロゞヌ

UNET SyncVar

Unityネットワヌクトランスポヌトレむダヌに぀いお



2.写真圢匏の゜ヌスコヌドの䟋は、英語のオリゞナル蚘事にありたした。



All Articles