[2021年] UnityのXRで使いたいリアルタイム技術・サービスの整理
概要
Iwaken Lab.「好きな技術・コト」のカレンダー | Advent Calendar 2021 - Qiitaの12日目の記事です。
UnityのXRで使いたいオンラインマルチプレイゲーム等の「マルチ」を支える「リアルタイム」技術を整理してみました。
動機としては、リアルタイム技術を勉強したいが、一体何から触ればいいのかが分からないので、リアルタイム、ネットワーク、マルチプレイゲームで調べ挙げて出てきた用語を整理して、個人的にさわってみたいものを探そうというものです。
個人のメモ的な側面が大きいです。
同じような事をされている先人の方々がおられるので、おすすめ記事として最初に紹介させて頂きます。
- Unity リアルタイムネットワークメモ - フレームシンセシス
- Unityのゲーム向けクライアント・サーバ・ネットワーク関連覚書 - Qiita
- 今、Unityでネットワークマルチプレイ作るのに何を使えばいいのか – soy-software
- VR/ARで使いたいUnity対応マルチプレイゲーム用BaaSを比較する | by Takashi Miwa | Kadinche Engineering | Medium
この記事の目的
- リアルタイム技術を勉強するための取っ掛かりとする
- 様々なレイヤーのリアルタイム技術選定の助けとなる
- リアルタイム技術を触ってみたい、勉強してみたい人向けのインデックス
- どのサービス、ミドルウェア、ライブラリを触ってみようとしたときの難易度の感覚を掴む
リアルタイム技術・サービスの整理
はじめに、ネットワーク方式について紹介し、BaaS (Backend as a service)、 Unityで利用可能な通信ミドルウェア、リアルタイム通信用ライブラリ、プロトコル、データシリアライズ毎にサービス・技術を並べています。
ネットワーク方式
クライアント同士が繋がるためにはどんな方式があるか
- Dedicated Server 方式
- Dedicated Server(専用サーバー) - フレームシンセシス
- Pub/SubモデルやROOMモデル
- この記事がとても分かりやすかったです。ソーシャルゲームを支える「リアルタイムサーバー」の作り方 - ログミーTech
- clusterのリアルタイムサーバー構成はpubsubベース (2021/12) thara
- スター型のネットワークが多め
- Listen Server 方式
- Unity リアルタイムネットワークメモ - フレームシンセシス
- 実質的にはP2P的なクライアント同士での通信になるが、NAT越えのためのリレーサーバーを経由することが多い
- メッシュ型のネットワーク多め
BaaS (Backend as a service)
バックエンドのインフラや様々なアウトゲーム的な機能を提供するサービス。アクセス数に応じたサーバーのスケーリングや、認証機能、適切なマッチメイキングや、プレイヤーデータ分析機能、マルチプラットフォーム機能などを提供する。
BaaS (Backend as a service)と呼ばれるサービスを含む。PhotonやMonobitよりも豊富なバックエンドサービスを提供しているサービスを並べました。
- サービスの例
Unityで利用可能な通信ミドルウェア
ネットワークエンジン、通信エンジン、ネットワークライブラリと言われていそうなミドルウェア。Unityクライアントの実装のみで通信の完結が可能なミドルウェアを並べています。
Server方式が適切かどうかは保障できませんが、分類するとしたらこんな感じかなという印象です。
- Listen Server方式
-
リレーサーバーを提供
- サーバー側をそんなに考えなくてもいい。
-
Unity - NetCode
- Netcode for GameObjectsを使ってみよう - Unityステーション - YouTube
- 旧MLAPI
- Netcode自体にリレーサーバーの機能はないが、Unity Relay β を使うと良いらしい。Unity Relay β でリレーサーバを建てて入室する【Unity Gaming Services】 - デニッキ!
- Monobit Unity Networking 2.0 (MUN) - モノビットエンジン公式サイト
- PUN2 | Photon Engine
-
Fusion | Photon Engine
- PUNに置き換わるものとして開発された
- Fusionイントロダクション | Photon Engine
- Strix Unity SDK 1.4 ドキュメント
-
SkyWay | アプリやWebサービスに、ビデオ・音声通話をかんたんに導入・実装できるSDK
- WebRTC Gateway | ドキュメント | SkyWay
- WebRTCに必要な4つのサーバー(シグナリングサーバー、STUNサーバー、TURNサーバー、SFUサーバー)をAPI経由で利用できる | SkyWay
- 使用例に「VRゲームの通信部分をWebRTCで実装する」とある
- ホントにUnityで利用できるのか気になる
-
Normcore. Seamless multiplayer for Unity.
- Documentation | Normcore.
- TrasnportにWebRTCが使われている
- ListenServer方式といっていいのか疑問
- Normcore PrivateはDedicatedServerを提供
- Diarkis
-
Unity - NetCode
- サーバー側をそんなに考えなくてもいい。
-
自前リレーサーバーが必要になる場合
-
vis2k/Mirror: #1 Open Source Unity Networking Library
- オープンソースなのでコードを読んで勉強できる
- LAN内ならリレーサーバは必要ない
- Transport層をカスタマイズできる
-
vis2k/Mirror: #1 Open Source Unity Networking Library
-
- Dedicated Server方式
- 自前で書くことが多い?
- HeadLessUnityサーバー
- Normcore Private
リアルタイム通信用ライブラリ
トランスポート層のTCPやUDPを扱いやすくするライブラリやフレームワークを並べた。
- Listen Server 方式で利用するタイプ
-
RevenantX/LiteNetLib: Lite reliable UDP library for Mono and .NET
- LiteNetLib #features
- Mirror向けのLiteNetLib:MichalPetryka/LiteNetLib4Mirror: LiteNetLib based transport for Mirror
- .NET用のRUDPを扱うライブラリ
- NAT越えはどうやって実現するのか?
-
Noble Connect | ネットワーク | Unity Asset Store
- Mirror向けでNAT越え用のリレーサーバーを提供
-
RevenantX/LiteNetLib: Lite reliable UDP library for Mono and .NET
- Dedicated Server方式で実装する場合に利用
-
sta/websocket-sharp: A C# implementation of the WebSocket protocol client and server
- UnityでWebSocket Protocolを扱えるようにしたUnityAsset
-
gRPC
- 言語に依存しないRPC(RemoteProcedureCall)フレームワーク
-
Cysharp/MagicOnion: Unified Realtime/API framework for .NET platform and Unity.
- gRPCをベースとしたHTTP/2のRPCストリーミングフレームワーク
-
chkr1011/MQTTnet
-
メタバースプラットフォーム cluster(クラスター)は2018/12の時点でm2mqttを使っている
- MQTTnet を Unity で使う - Qiita
- aws-summit-2020-fixed
- clusterがどのAWSのMQTTサーバーを使ってるかは分からなかった。これか?Amazon MQ(ActiveMQ 向けマネージド型メッセージブローカーサービス)| AWS
-
メタバースプラットフォーム cluster(クラスター)は2018/12の時点でm2mqttを使っている
-
sta/websocket-sharp: A C# implementation of the WebSocket protocol client and server
- その他
プロトコル
リアルタイム系の通信用ライブラリに関連するプロトコルを並べた。
-
- TCP上で双方向通信を可能にしたHTTPと互換性のあるプロトコル。443番ポートと80番ポート上で動作する
-
MQTT(MQ Telemetry Transport) - Wikipedia
- TCP/IPによるPub/Sub型データ配信モデルのプロトコルでIoT機器向けで使われることがある。
- MQTT プロトコルの概要
-
将来のプロコル
- HTTP/3
- Quick
- WebTransport
- 上3つに関して、とても分かりやすい記事です。WebSocketの次の技術!?WebTransportについての解説とチュートリアル - Qiita
シリアライズ
送りたいデータを人が読める形(json等)ではなく、バイナリでおくることで、通信効率を高めることができる。
- Protocol Buffers | Google Developers
-
neuecc/MessagePack-CSharp: Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). / msgpack.org[C#]
- C#向けのMessagePack
検証・小規模向けにマルチプレイゲームを作ってみたい
難易度低そう
クライアントの実装が必要。リレーサーバーが必要な場合は、それぞれのサービスのコンソールで準備する。
難易度高そう
ListenServer型
-
Mirror + LiteNetLib4Mirror
- LAN内で使う場合
DedicatedServer型
サーバーとクライアントの両方の実装が必要になる。
- HeadLessUnityサーバー方式
-
Mirror + LiteNetLib4Mirror
- NAT越えの問題あり
-
Mirror + Noble Connect | ネットワーク | Unity Asset Store
- リレーとNAT越えが可能
-
Mirror + LiteNetLib4Mirror
- 土管サーバー方式
- WebSocket + protobuf
- MajicOnion + MessagePack
- gRPC + protobuf
- リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
難易度分からないけど気になる
- WebRTC Gateway | ドキュメント | SkyWay(アプリやWebサービスに、ビデオ・音声通話をかんたんに導入・実装できるSDK)
-
Firebase Realtime Database | Firebase Documentation
- XRの位置同期につかえるのか気になる
- Netcode for GameObjectsを使ってみよう - Unityステーション - YouTube
- chkr1011/MQTTnet
参考にしたリンクのリンク集
今後の予定
- PubSubモデルについてTopicモデルではなく高頻度通信向けがあることを付け足す
- この記事に図を追加する
- 触ってみたい技術・サービスを使ってアレのデモをつくる
Discussion
cluster は MQTT を生で使っていないのでマネージドではなく EC2 上に直ホストしているみたいです。