» VR開発メモトップへ

Unity リアルタイムネットワークメモ

最終更新日:2021年09月14日

UnityでオンラインゲームやソーシャルVRを開発する場合に検討対象となる技術についてのメモです。

更新履歴

(2021年9月14日)gRPCとProtocol Buffersについて追記
(2021年9月13日)MagicOnionについて追記、「ブラウザのネットワークAPI」の項目を追加
(2021年9月11日)Photon Industriesについて追記
(2021年8月20日)Epic Online Services Plugin for Unityのリンクを追加、mBaaSの項目を追加
(2021年8月19日)MLAPIの名前がNetcode for GameObjectsに変わったのを反映、ホストマイグレーションについて追記


ネットワーク構成について

ゲームサーバーには主にDedicated Server(専用サーバー)とListen Serverの2つのタイプがある。

Dedicated Server(専用サーバー)

サーバーにすべてのプレイヤーがクライアントとして接続する方式。クライアント間の通信はすべてサーバー経由で行われる。サーバーはローカルネットワーク内に立てたり、クラウドに立てて適宜スケールさせる(ゲームサーバーホスティングを参照)。

クライアントが誰も接続していないときもサーバーが動いている限り状態が維持されている。サーバー費用と運用のコストがかかる。

サーバーにUnityを使用する場合

Unityでビルドした実行ファイルをゲームサーバーとして用いる方式。クライアントと同じプロジェクトファイルをサーバープログラムとしてビルドする。サーバー側でクライアント側と同じ情報を用いてAIや物理シミュレーション等を実行できる特徴がある。難点として、ゲームエンジンで作ったサーバーは重い傾向がある。

サーバーにUnityを使用しない場合

単体のプログラムとしてゲームサーバーを書く方式。リアルタイムオンラインゲームではC++、Java、Go、C#等の高速な言語を用いることが多い。gRPCやMagicOnion等を使用することがある。

Listen Server

プレイヤーの1人がサーバーの役割を兼ね(ホスト)、他のプレイヤーのクライアントが接続する方式。ゲームを一般公開するためには、クライアント同士がお互いの存在を知って通信を開始できるようにするためのマッチングサーバーが必要(いわば「引き合わせはしたからあとはみんなでやり取りしてね」という方式)。P2Pで直接通信することが多い(多かった)が、NAT等で疎通できない場合が多いので、通信を経由するリレーサーバーが必要。マッチングサーバーやリレーサーバーをSaaSとして提供しているPhoton Cloudのようなサービスがある。

一般にホストとなるプレイヤーはゲームシミュレーションを行うので他のクライアントに比べて負荷がかかる。ホストが終了するとクライアントが切断されてしまうので、必要な場合は、別のクライアントをホストにして再接続する(ホストマイグレーション)。

PhotonではP2P通信はせずメッセージ通信は必ずリレーサーバー経由になる。また、「マスタークライアント」という概念があり、ホストマイグレーションが簡単に行える。

Unityで使用できるネットワークAPI

Netcode for GameObjects(旧MLAPI)

Unity公式のネットワークAPI。MLAPIからNetcode for GameObjectsに名前が変わった

専用サーバー方式とListen Server方式どちらも可能。今後のロードマップが示されており、長期的に使えることが期待できる。現時点では成熟していないらしくMirrorを勧める声を耳にする。ホストマイグレーションに未対応

マッチングサーバーは提供されていない。リレーサーバーは非公式のMLAPI.Relayが使用できる(.NET Core製)。

Photon Realtime Transport

Netcode for GameObjectsにはPhoton Realtimeのカスタムトランスポートがあり、Photonのリレーサーバーが利用可能。Boss Roomサンプルが実際に使用している。

今のところエディタで接続するとすぐ切断される不具合がある模様(ビルドすると大丈夫)。Photonのホストマイグレーションは利用できないので注意。ホストマイグレーションを手動で行う方法のヒント

Photon (PUN)

ドイツExit Games社が運営するゲームネットワークサービスとそのSDK。PUNはPhoton Unity Networkingの略。

Photon Cloudを使用すれば自分でサーバーを立てなくてもオンラインゲーム開発を始められる。無料で試せるが、同時接続者数(CCU)で課金され、20ユーザーを超えると有料になる。ルームを立ててその中にユーザーが入る方式。ルームあたり500メッセージ/秒の制限があり、プレイヤーが増えるとメッセージ数が爆発してすぐ上限に達するのでプレイヤー数は大きく増やせない。

サーバーを自分で立てるPhoton Serverもある。サーバー費用・運用のコストがかかるが、上述のメッセージ数制限がない。こちらもCCUで課金される

多くのオンラインゲームで使用されていて実績がある。ソーシャルVRではVRChatRec Roomが使用している。また、WebGLビルドでもいい感じに動くらしい(WebSocketsが使用される)。

o8queさんのドキュメントが神。

Photon Serverを使えばローカルネットワーク内でも使用できる。が、ライセンス認証のためにインターネット接続が必要。インターネットに接続できない場合はオフラインライセンスを提供しているとのこと(ページ右下の記述フォーラムの回答)。

なお、Exit Games社の経営基盤については、2007年に460万ドル2021年8月に5000万ドルの投資を受けた記事が見つかる。

Photon Fusion

なんかすごいらしいPhotonの次世代サービス。MLAPI(Netcode for GameObjects)やMirrorと比べ帯域使用が6分の1で、60Hzで最大200プレイヤーを実現するとか書いてある。上記のメッセージ数の緩和に期待できるかもしれない。ベータ版のSDKが提供されている。お値段が気になる。

Dedicated Serverも可能とか、Area of Interestとかいろいろ気になる(要調査)。

Mirror

UNetという昔のUnityのネットワークAPIがあったが、それを正常進化させたような存在。専用サーバー方式とListen Server方式どちらも可能。

リレーサーバーや専用サーバーを自分で立てる必要がある。実績が豊富。専用サーバーで150ユーザーとか行けるらしい。

WebGLビルドでサーバーをホストできるらしいリレーサーバー。

MagicOnion

上に挙げたものとは異なり、C#のみでゲームサーバーを作る際に通信に用いられるライブラリ。クライアントとサーバーを両方C#で書くことができる(neueccさんが提唱されている「C#大統一理論」)。

gRPCを基盤として用いている。ただし、gRPCではProtocol Buffersの.protoファイルをスキーマとして用いるが、MagicOnionはC#のインターフェースを利用する。gRPCがHTTP/2で動いているのでTCP通信のみ。

gRPC

HTTP/2上でProtocol Buffersで定義したAPIを使ってクライアント・サーバー間でメソッドを呼んだりするフレームワーク。MagicOnionが基盤として用いている。C#以外でゲームサーバーを書くならgRPCを使う場合がありそう。

下記ページによればRust、Go、C#、C++あたりが速いらしい。

Protocol Buffers

Googleが開発した、言語中立なシリアライズ・デシリアライズの仕組み。IDL(インタフェース記述言語)となる.protoファイルでプロトコルを定義し、protocコマンドで各言語のシリアライズ・デシリアライズ用コードを生成することで、異なる言語間で共通するデータのやり取りができるようになる。

上記チュートリアルをやればどういうものか分かります。

ボイスチャット

Photon Voice

VRChatが使用している。

Photon Voice 2をインポートしてApp IDを入力し、DemoVoiceシーンあたりを再生すればオーケー。PUNと組み合わせたデモもある(DemoVoicePun-Sceneシーン)。導入がめちゃくちゃ簡単。

Photon Voice Network、Recorder、Speakerが主要コンポーネント。さらにPUNとの連携用にPhoton Voice Network、リモートのRecorderにネットワークPrefabのSpeakerをバインドするPhoton Voice Viewコンポーネントがある。

Photon Voice自体は必ずしもPUNと一緒に使う必要はなく、単独でも使える。その場合、Window > Photon Voice > Remove PUN、Remove Photon ChatでPUNやPhoton Chatのアセットを削除して軽量化できる。

WebGLビルドには非対応PUN2VoiceWebGLUnityというのが見つかるが……。

Vivox

PUBGやLoLが使用している。Unityに買収された。インディー開発者は5000 PCU(ピーク同時接続ユーザー数)まで無料(上記ページ左下)。Enterprise Supportからいきなり$2500/月になる。

Agora

Clubhouseが使用していることで話題になった。UnityのSDKもある。月10000時間まで無料。SDKがコンパクト。

ゲームサーバーホスティング

AWS等のクラウドでゲームサーバーをホスティングする際、ランニングコストがかかるので、多数のサーバーを常時立ち上げっぱなしにしておくことはできません(特にプレイヤーが大きく増えたり減ったりする場合)。プレイヤーの参加に応じて自動的に新しいサーバーを立ち上げたりシャットダウンするためのサービスやソフトウェアがあります。

Amazon GameLift

Unityでビルドした実行ファイルをアップロードして、カスタムゲームサーバーとして実行・オートスケーリングできるサービスです。費用はOn-Demandで一番安い2仮想コアのc5.large 1インスンタンスが$50/月くらい(スポットインスタンスなら数分の1になる)。WindowsサーバーはLinuxサーバーの数倍の費用がかかるので、通常はLinuxビルドしたサーバーを使うことになりそうです。

サーバーのSDK(GameLift Managed Servers SDK)をビルドしてDLLをUnityのプロジェクトに組み込む必要があります。com.unity.nuget.newtonsoft-jsonがコンフリクトする問題が起きていますが、Version Controlパッケージをアンインストールすればオーケー。

Azure PlayFab (Microsoft)

Kubernetes

Agones

Multiplay(Unity)

mBaaS(mobile backend as a Service)

ユーザー認証等、多くのゲームやモバイルアプリで使用されるバックエンド機能を提供しているサービスがあります。

  • Azure PlayFab(Microsoft)
  • GameSparks(Amazon)
  • Firebase(Google)
  • NCMB(ニフティ)

Epic Online Services

NAT越えのP2P通信やボイスチャット等が無料で使えるらしい。けど、Unityだと現時点では情報や実績が少なくかなり苦労しそう(Unreal Engineに移行してしまう手が)。

(2021年8月)Unityのプラグインの提供が開始された。

通信プロトコル

TCP vs UDP

TCPは信頼性のある通信を行うためのプロトコルですが、パケットロスが発生するとパケットの再送が行われ、後続のパケットが届くまで通信が途絶えてしまい(Head-of-line blockingといいます)、ゲームのリアルタイム通信では問題になることがあります。高頻度の位置同期や音声通信、Wi-Fi経由の通信等、パケットロスを気にせずに新しい情報をどんどん送ってほしいというケースではUDPが使われる場合があります。

UDPの上に信頼できる通信を行うレイヤーを作るということがよく行われており(Reliable UDP)、LiteNetLib等のライブラリがあります。

HTTP/2

HTTP/3

ブラウザのネットワークAPI

ブラウザでは素のTCP・UDP通信ができず、主に以下のAPIを用いてリアルタイム通信を行います。UnityのWebGLビルドにおいてもこの制限がかかってくるため意識する必要があります。

WebSocket

ブラウザでのリアルタイム通信に使用されます。RFC 6455で定義されたTCP上で双方向通信をするためのWebSocketプロトコルがあり、ブラウザで使用できるWebSocket APIがあります。名前から誤解しやすいですが、通常のソケット通信とは別物です。

WebRTC

クライアント間で音声やビデオをP2Pで通信するためのプロトコル。DataChannelでデータも送れる。UDPを使用。

WebTransport

現在仕様策定中の新API。WebSocketと同じような要領でUDP通信が可能になるため期待されています。

その他

Unityでのマルチプレイヤー開発の効率化

マルチプレイヤーのゲームを開発する際に、一つのプロジェクトファイルを複数のUnityエディタで再生できると便利です。Windowsでは下のようにmklinkコマンドでプロジェクトのフォルダのジャンクションを張ることで、同一のプロジェクトを複数のUnityで開くことができます。

mklink /J Assets %1\Assets
mklink /J Library %1\Library
mklink /J ProjectSettings %1\ProjectSettings

これを簡単にするParrelSyncというエディタ拡張があります。パッケージをインストールしてParrelSync > Clones Managerからプロジェクトを手軽にクローン・削除できます。

また、UnityのロードマップにUnder Consideration(検討中)のステータスですがVirtual Projectsというのがあって気になります。

参考資料

以下φ(..)メモメモ中

書いた人:こりん(@korinVR
» VR開発メモトップへ