paint-brush
Unity リアルタイム マルチプレイヤー、パート 8: 既製のネットワーキング ソリューションの探索@dmitrii
7,178 測定値
7,178 測定値

Unity リアルタイム マルチプレイヤー、パート 8: 既製のネットワーキング ソリューションの探索

Dmitrii Ivashchenko11m2023/08/31
Read on Terminal Reader

長すぎる; 読むには

マルチプレイヤー ゲームでは、クライアントを同期する必要があります。あらゆる種類のユースケースに対応する既製のネットワーキング ソリューションをいくつか見てみましょう。
featured image - Unity リアルタイム マルチプレイヤー、パート 8: 既製のネットワーキング ソリューションの探索
Dmitrii Ivashchenko HackerNoon profile picture
0-item


マルチプレイヤー ゲームでは、クライアントを同期する必要があります。トランスポートからデータ パケットを直接交換することも可能ですが、経験の少ない開発者にとっては複雑になる可能性があります。そこで、あらゆる種類のユースケースに対応する既製のネットワーキング ソリューションをいくつか見てみましょう。


こんにちは!私は MY.GAMES のリード ソフトウェア エンジニア、Dmitrii Ivashchenko です。 2023 年の Unity リアルタイム マルチプレイヤーの状況に関する記事シリーズは続きます。今日のトピックは、私たちが利用できるリアルタイム マルチプレイヤー用の既製のソリューションに関するものです。始めましょう。

交通手段に関する簡単なメモ

マルチプレイヤー ゲームでは、サーバーとクライアントはネットワーク上でパケットを送信することによってデータを交換します。異なる場所から接続しているプレイヤーに共有仮想空間を作成するために、ゲーム プロセス内のイベント (キャラクターの動きやオブジェクトの作成など) は、データ パケットを送信することで他のクライアントと同期されます。ネットワーク上でパケットを送受信する責任者は、トランスポート層と呼ばれます。


理論的には、トランスポートの送信関数を直接呼び出してこれらのパケットを送信することは可能ですが、このアプローチは、マルチプレイヤー ゲームの操作経験がほとんどない開発者にとってはすぐに不便になる可能性があります。したがって、独自のものを最初から作成するのではなく、以下にリストされているもののいずれかを使用することをお勧めします。それらの解決策を見てみましょう。

Unity リレーとネットコード

Unity は 2 つの Netcode パッケージを提供しています。Netcode for GameObjects (プレビュー リリース段階)、Netcode for Entities (実験的モード)、および非推奨の UNET です。また、ゲーム クライアントを接続するための Unity Relay サービスも提供します。これについては今すぐ触れましょう。

ユニティリレー

Unity Relay は、ゲーム開発者が、サードパーティ ソリューションへの投資、専用ゲーム サーバー (DGS) の維持、またはマルチプレイヤー ゲームのネットワークの複雑さを心配することなく、参加コード メカニズムを介してプレイヤー間の接続性を強化する方法です。 Relay サービスは、DGS を使用する代わりに、プロキシとして機能するユニバーサル Relay サーバーを介して接続を提供します。

ユニティリレー


Relay サービスを使用すると、プレーヤーは UDP、DTLS、セキュア WebSocket (WSS) などのいくつかの異なるプロトコルを介して通信できます。リレー サーバーを選択すると、クライアントは前述のプロトコルのいずれかを使用してリレー サーバーと直接通信します。 WebSocket 接続により、WebGL を使用したブラウザでのマルチプレイヤー接続が可能になります。


Relay はあらゆるゲーム エンジンでの動作をサポートします。 Unity で Relay を使用している場合は、Unity Transport Package (UTP) と統合されている Relay SDK を使用することがベスト プラクティスです。

Unityトランスポートパッケージ

Unity Transport は、マルチプレイヤー ゲームを開発するための低レベルのネットワーク ライブラリです。これは Netcode for GameObjects と Netcode for Entitiesの基礎となりますが、ソリューションで使用することもできます。


Unity Transport は、UDP と WebSocket 上に提供される接続ベースの抽象化レイヤー (組み込みネットワーク ドライバー) のおかげで、Unity Engine でサポートされるすべてのプラットフォームを簡単にサポートします。 UDP と WebSocket は、暗号化の有無にかかわらず構成できます。パイプラインを使用して、信頼性、パケットの順序付け、パケットの断片化などの追加機能を取得することもできます。


Transport 2.0 の主な機能には、WebGL のサポートの追加が含まれます。これにより、Unity Transport パッケージを Unity Engine のサポートされているすべてのプラットフォームで使用できるようになります。トランスポート ユーザーは、TLS の有無にかかわらず、Websocket トランスポートの実装にアクセスできるようになりました。移動中のプレーヤーは、通常は携帯電話の塔間での透過的なネットワーク移行を利用できるようになりました。この機能は現在、クライアント側と UDP トランスポートに限定されています。


Unity Transport を使用するには、Unity Editor バージョン 2022.2 以降をインストールし、 com.unity.transportパッケージもインストールする必要があります。


Unityトランスポートパッケージ


Relay は Unity Transport (UTP) と連携して動作し、これにより、厳格なファイアウォールなどのルーティング制限により通信できないクライアントの接続が可能になります。

Unity リレーの制限事項

リレーには次の制限があります。


  1. 現在、リージョンロック機能はありません。リクエストに対応するのに十分な容量がある場合は、誰でもどのリージョンでも割り当てをリクエストできます。
  2. Relay サービスは、すべてのトラフィックを 1 つの選択されたホスト リージョン経由でルーティングします。その結果、地域間の通信では最適な遅延が得られない可能性があります。
  3. 単一のゲーム セッション内で最大 100 人のプレイヤーがホストに参加できます。
  4. Relay サービスは、レート制限を使用して、特定の秒内に API が受信するリクエストの数を制限することでネットワーク トラフィックを制御します。 「割り当ての作成」、「参加コードの作成」、「リレーに参加」、および「領域のリスト」リクエストについては、1 分あたり 60 リクエストの制限が設定されています。この制限は、認証された各プレーヤーに適用されます。


制限はありますが、Relay サービスはプレーヤーの接続を簡素化し、スムーズなマルチプレーヤー ゲーム エクスペリエンスを提供する強力なツールです。

ゲームオブジェクトのネットコード

Relay のメイン ゲーム ネットワーク コードの最も人気のある 2 つのソリューションには、Netcode for GameObjects (NGO) と API Mirror Networking があります。


推奨されるベスト プラクティスは、ネットワーク変数、シーン管理、リモート プロシージャ コール (RPC)、メッセージングなどの安定したコア機能セットを提供する NGO を使用することです (ほとんどの場合)。ただし、API ミラー ネットワーキングはそのシンプルさと使いやすさにより、NGO が提供する完全な機能セットを必要としないゲームにも最適です。

フォトンリアルタイム

Photon リアルタイム ロゴ


Photon Realtime は、マルチプレイヤー ゲーム (および Photon のより複雑なネットワーク ソリューション) のコア レイヤーです。スケーラブルなアプローチを使用して、プレーヤーのマッチメイキングや高速通信などの問題に対処します。 Photon Realtime は、ゲームとより具体的なマルチプレイヤー ソリューションの両方で使用されます。


Photon Realtime には、Fusion や Quantum ソリューションに見られるようなゲーム ステートとシミュレーションの同期メカニズムは含まれていませんが、代わりにネットワーク上のメッセージ トランスポートに重点を置いています。


Photon Realtime という用語には、クライアントとサーバー間の対話を定義する API、ツール、サービスの広範なフレームワークも含まれます。


すべての Photon Realtime クライアントは、認証と地域配信 (ネーム サーバー)、プレーヤーのマッチング (マスター サーバー)、およびゲームプレイ (ゲーム サーバー) という 3 つの異なるタスクに分割された一連の専用サーバーに接続します。これらのサーバーはすべて Realtime API を通じて管理されるため、心配する必要はありませんが、サーバーについての知識があれば確かに役に立ちます。


Photon Cloudは、Photon Realtimeクライアントにグローバルホスティングを提供するフルマネージドサービスです。ゲーム コードは Photon Cloud と通信し、クラウドに接続し、その API を使用して接続、ランダム ルームへの参加、イベントの発生などのアクションを実行します。


Photon Realtimeでは、ルームデータを簡単に保存およびロードでき、Webhookを設定してPhoton Cloudを外部Webサーバーに接続できます。

フォトンフュージョン

フォトンフュージョン


Photon Fusion は、Unity のネットワーク状態同期用の新しい高性能ライブラリです。 2 つの根本的に異なるネットワーク トポロジと、単一の API を使用してネットワーク接続を使用しない 1 人のプレーヤー用のモードをサポートします。


Fusion は、Unity ワークフローへの統合を念頭に置いてシンプルに設計されており、データ圧縮、クライアント側の予測、遅延補正などの高度な機能を「すぐに使える」状態で提供します。


たとえば、Fusion では、RPC とネットワーク状態は、明示的なシリアル化コードを必要とせずに、 MonoBehaviourメソッドとプロパティの属性によって定義され、最新の Unity プレハブ機能をすべて使用して、ネットワーク オブジェクトをプレハブとして定義できます。


Fusion は最新の圧縮アルゴリズムを使用して、プロセッサのオーバーヘッドを最小限に抑えながら帯域幅要件を削減します。データは完全に圧縮されたスナップショットとして、またはその後の一貫性が確保された部分ブロックとして送信されます。後者の場合、完全にカスタマイズ可能な関心領域システムが提供され、非常に多くのプレイヤー数に対応できます。


Fusion はティックベースのシミュレーションを実装し、共有モードまたはホスト モードで動作します。主な違いはネットワーク オブジェクトに対する権限を誰が持つかですが、これによって他のどの SDK 機能が利用できるかが決まります。


Fusion は、Unity 用の 2 つの既存の Photon 製品 (Bolt と PUN) を置き換えるために開発されました。 Fusion の重要なコア コンポーネントは、 NetworkRunnerNetworkObjectです。 NetworkRunner Fusion のコアと考えることができます。シーン内にはネットワーク操作とシミュレーションを管理する 1 つのランナーがあります。


Fusion は、ゲームやプロトタイプを迅速に作成できるように、さまざまな事前構築済みのNetworkBehavioursを提供します。

Fusion では、入力処理を 2 つのステップに分割します。1 つはローカル ハードウェアから入力を収集して構造に配置し、次にその入力を読み取ってゲームの状態を変更する (シミュレーションを進める) というものです。


Fusion は、標準の Fusion 入力または[Networked]プロパティの使用が最も現実的な解決策ではない場合に備えて、RPC (リモート プロシージャ コール) をサポートしています。 Fusion を使い始めるには、Fusion Getting Started Guideを読むことをお勧めします。

光子量子

光子量子


Photon Quantum は、マルチプレイヤー ゲーム用の完全に決定的なエンジンです。予測/ロールバックのアプローチに基づいており、アクション RPG、スポーツ ゲーム、格闘ゲーム、FPS など、遅延に敏感なオンライン ゲームに最適です。


このエンジンを使用する場合、ネットコードは必要ありません。すべてのゲーム要素はデフォルトでネットワーク化されており、100% 同期されています。ローカル マルチプレイヤー エクスペリエンスを開発する場合と同様に、接続された複数のプレイヤーを含む 1 つのシミュレーションを作成するだけです。 Quantum の決定論的サブシステムは、物理学、ボット、経路探索、アニメーションなどの各クライアント上のシミュレーションが常に同期され、遅延がないことを保証します。


Photon Quantum は完全に決定的なエンジンです


決定論的なゲームは本質的に不正行為に対して耐性があります。チーターとの戦いは、リプレイの確認やサーバージャッジシミュレーション (最も効果的なチーター対策) によって行われます。


プレーヤーの入力は Photon Cloud サーバーに送信され、他のプレーヤーに配布されます。 Webhook を使用して独自のバックエンドとプラグインを接続し、サーバー側でカスタム コードを実行できます。


Photon Quantum は ECS アーキテクチャに基づいて構築されており、PC、コンソール、VR、携帯電話上で物理的負荷の高いマルチプレイヤー ゲームでも実行できる高いパフォーマンスを実現すると主張されています。


Quantum でエンコードされたシミュレーションは Unity に依存せず、どこでも実行できます。すべてのローカル アクションは遅延なく実行され、リモート入力は予測されてロールバックされます。 Quantum にはリプレイを表示する機能があります。リプレイはバックエンドに保存したり、ゲーム内で使用したりできます。まず、Quantum 100 シリーズをチェックしてください。

ノームコア

ノームコア


Normcore は、Unity ベースのプロジェクトにマルチプレイヤー モードを追加するための高性能ツールです。 Normcore には、ネットワーク物理学、永続スペース、音声チャット、XR サポートが含まれます。


Normcore は、 RealtimeTransformコンポーネントを追加すると、すべてのオブジェクト変換を自動的に同期します。これにはコーディングは必要ありません。さらに、Normcore は状態依存の補間と信頼性の高いネットワーク物理学を提供し、あらゆる接続において完璧な動きを実現します。


Normcore の主な利点の 1 つは、WebRTC に基づく高速なデータ転送です。送信中に断片化が発生しない最大パケット サイズが使用されるため、データ転送プロセスが高速化されます。 Normcore のすべてのデータ パケットはデフォルトで暗号化され、ユーザー データのセキュリティと機密性が確保されます。


Normcore はデルタ アップデート システムも使用します。これは、最後のパケットが送信されてからのすべての変更を追跡し、新しいパケットを送信するときには、そのパケットに何を含めるべきかをすでに知っていることを意味します。これによりリソースが節約され、パフォーマンスが向上します。 Normcore のデータ シリアル化機能により、CPU 使用率の最適化が可能になります。すべてのシリアル化コードはプロジェクトのコンパイル前に自動的に生成されるため、リソースの高速かつ効率的な使用が保証されます。


Normcore サーバーは世界中の地域で運用されており、プライベート光ファイバー ネットワークを通じて接続されているため、遅延が短くなります。 Normcore を独自のサーバーでホストすることも、Normcore がクラウド インフラストラクチャのプライベート コピーをホストすることを許可することもできます。

ミラーロゴ


Mirror Networking は、使いやすさと信頼性を考慮して最適化された Unity 用の高レベルのネットワーク ライブラリです。このライブラリは、ネットワーク接続での作業プロセスを簡素化し、開発者がプロジェクトの作成に集中できるように設計されています。


ミラー ネットワークは、12 を超える低レベル プロトコルと互換性があり、常に進化し、改善されています。これには、ネットワーク上のリモート プロシージャ コールとコンテキスト管理の機能が含まれており、ネットワーク アプリケーションでの物理演算の操作もサポートされます。


このライブラリには、12 を超える組み込みネットワーク アダプターと 5 つのネットワーク管理システム オプションが用意されており、開発者はカスタム バージョンを作成できます。学習とコーディングのプロセスを容易にするために、いくつかの完全な使用例も含まれています。

なかま

なかまのロゴ


Heroic Labs のnakama は、インフラストラクチャ全体を 1 つのオープン パッケージで所有できる人気のオープンソース ゲーム サーバーです。 nakama には、必要なリアルタイム ゲーム API とソーシャルおよび競争機能がすべて含まれています。


リアルタイム マルチプレイヤー機能やソーシャル機能、対戦機能など、ゲームに必要な機能をすべて備えたnakama では、Go、TypeScript、Lua を使用してクライアント側とサーバー側の両方であらゆる側面をカスタマイズできます。 nakama を使用すると、リアルタイムのマルチプレイヤー対戦ゲームの作成、マッチメイキング アルゴリズムのカスタマイズ、毎日の報酬の追加、リーダーボードの作成、ゲーム内通貨の実装、リアルタイム チャットの提供が可能になります。

魚網

フィッシュ ネットワーキングのロゴ


Fish-Networking は、経験豊富なゲーム デザイナーによって開発された、Unity のネットワーキング ソリューション用の無料のオープンソース ライブラリです。通常は有料ソリューションでのみ利用できる広範な機能セットを提供します。


Fish-Networking の主な利点は、帯域幅とリソースの最適化 (サーバー コストを節約できる)、多数のプレーヤー (数十から数百) のサポート、およびクライアント予測、遅延補正、サーバー負荷などの組み込み機能です。バランシング、およびネストされたネットワーク オブジェクトのサポート。

ソリューションの概要

次の表は、Unity でのゲーム開発のためのさまざまなネットワーク ソリューションの概要を示し、使用されているプロトコル、サポートされているトポロジ、セッションあたりの最大プレイヤー数、サポートされている Unity の最小バージョン、および 2023 年半ばの現在のステータスによって比較しています。

解決

プロトコル

トポロジー

最大。セッションごとのプレイヤー数

Unity の最小バージョン

状態

エンティティのネットコード

UDP、WebSocket

Unity Relay、P2P、クライアントホスト型、DGS

100 (ユニティリレーの制限)

2022.3

🧪 実験的

ゲームオブジェクトのネットコード

UDP、WebSocket

リレー (Unity リレー経由)、P2P、クライアント ホスト型、DGS

100 (ユニティリレーの制限)

2021.3

ℹ️プレリリース

フォトンリアルタイム

信頼性の高い UDP、TCP、HTTP、または WebSocket

リレー(Photon Cloud経由)、DGS

32

2018.4

✅ 本番環境に対応

フォトンフュージョン

TCP、RUDP、WebSocket

リレー(Photon Cloud経由)、P2P、クライアントホスト型、DGS

200

2020.3

✅ 本番環境に対応

光子量子

RUDP

リレー(Photon Cloud経由)

32

2018.4

✅ 本番環境に対応

ノームコア

UDP および TCP 上のWebRTC

リレー (Normcore クラウド経由)

100

2020年LTS

✅ 本番環境に対応

ミラーネットワーク

KCP 、WebSocket

クライアントホスト型、DGS、P2P、リレー

200

2020年LTS

✅ 本番環境に対応

なかま

RUDP

リレー権威、クライアントホスト型

サーバーのパフォーマンスによる制限

2018.4

✅ 本番環境に対応

魚網

RUDP、WebSocket

リレー、P2P、DGS

200

2019.4

✅ 本番環境に対応

フォトンPUN

UDP、TCP、WebSocket

DGS、リレー、P2P、クライアントホスト型

32

2019.4

⚠️ 非推奨

フォトンボルト

UDP、TCP

P2P、DGS

50

2019.4

⚠️ 非推奨

UNET

TCP、UDP

クライアントホスト型、DGS

サーバーのパフォーマンスによる制限

5.1

⚠️ 非推奨


利用可能なさまざまなソリューションにより、開発者は特定のニーズに合ったツールを選択できます。多くのソリューションはさまざまなタイプのトポロジをサポートしているため、ゲームの特定の要件に適応させることができます。 Photon PUN、Photon BOLT、UNET などの古いネットワーク ソリューションの一部は時代遅れであるため、新しいプロジェクトでの使用は推奨されません。一方、Netcode for Entities と Netcode for GameObjects はまだ実験段階またはプレリリース段階にあります。実稼働環境での使用はまだ許可されていません。