Unity の Relay と Lobby について調べたメモ
How to 記事ではありません。自分が Unity の Relay と Lobby で調べたことをメモ代わりに。
Relay
Unity Documentation (Unity Relay)
プレイヤー間で安全性の高いピアツーピアの、リッスンサーバーを使用した UDP 通信を簡単に実現(原文ママ)
- Relay servers という Unity が提供してくれている(のかな?)専用サーバを proxy のように介すことでプレイヤー間での接続を実現
- 全プレイヤーが接続可能なエンドポイントとして Relay server は振る舞い、全プレイヤーは同じ IP アドレス、ポートに接続する
- つまり実際にプレイヤー同士が直接コネクションを張る訳ではない
- NAT 越えやファイヤーウォールなど一般的にネットワーク接続において課題となる問題を気にせずに済む
最大プレイヤー数は allocation を作成するときに指定可能
プレイヤーが タイムアウト したら Relay server はそのプレイヤーを切断する
- デフォルト TTL は 10秒
- ただしホストが一人の場合は TTL は 60秒
- タイムアウトを防ぐために PING メッセージ を Relay server に送信できる
- もし Relay with NGO を使っているなら network manager が自動でコネクションを維持する
- もし Relay with UTP を使っているなら手動でコネクションを維持する必要がある
- CLOSE message を送信しても接続解除が可能
Allocations
ゲームセッションのためにゲームサーバーを予約する機能
リクエストを受信したらそれに最適なサーバーを探し割り当てる
- サーバーが見つかったらそれを利用可能なサーバープールから削除し、その情報を呼び出し元へ送信する
- deallocates するまで残り続ける
- ゲームサーバーの検索は主に以下の情報でもって行われる
- サーバーのリージョン
- サーバーとゲームクライアントの通信品質
- サーバーのビルドとビルド設定
-
- Game Server Hosting API を使用
- Game Server Hosting SDK を使用
- Unity Cloud Dashboard を使用
Relay with Netcode for GameObjects (NGO)
Relay with Netcode for GameObjects (NGO)
- NGO 側のホスト、サーバー、クライアント間での Rpc 呼び出し方法などのサンプルがまとまっている
これらを読めば Relay と NGO を使ったマルチプレイの簡単な実装ができる
ただし別ネットワーク間で通信する場合は Network Manager の Unity Transport の Allow remote connection
を有効にしないといけなさそうだった
Lobby
プレイヤーがマルチプレイゲームにおいて他のプレイヤーを探して接続するための機能を提供するサービス
サービス例
- 利用可能なゲームセッションのリストを表示し、プレイヤーがセッションを選択して参加
- フレンドと join code を共有して自分のゲームセッションにフレンドが直接接続
- Quick Join を使って利用可能なマッチを探して参加
- プライベートロビーを作りゲーム内フレンドリストのフレンドを招待
- ゲームサーバからロビーをホストし、サーバーセッションへのアクセスを管理及び制限
- ゲームモードやタイプなどといった要求をもとににロビーをクエリ
プレイヤーの既存のゲームセッションへの再ジョインを可能に
予期しない切断後のホストの移行を容易に
ロビーの作成
いくつかのプロパティをセットして create コールを行うことでロビーが作成できる
プロパティ
ロビーサンプル
Unity Documentation (Game lobby sample)
まだ試せてないが、規模の大きいサンプルのようで既存のプロジェクトに入れて試すというよりはリファレンスとする方が良いみたい。
Relay vs Lobby
Relay
- サーバー/クライアント環境を使用してプレイヤーを P2P 方式で接続するネットワーキングソリューション
- 専用ゲームサーバーや P2P 接続の複雑さを無視してマルチプレイヤーゲームのセッションを容易に実現
Lobby