これちのPost-it

技術ネタをペラペラと

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 を使っているなら手動でコネクションを維持する必要がある
        • が、そもそも UTP ではなくよりハイレベルな API を提供する NGO を使うことが現時点では推奨されている
    • CLOSE message を送信しても接続解除が可能

Allocations

Allocations

ゲームセッションのためにゲームサーバーを予約する機能

  • リクエストを受信したらそれに最適なサーバーを探し割り当てる

    • サーバーが見つかったらそれを利用可能なサーバープールから削除し、その情報を呼び出し元へ送信する
    • deallocates するまで残り続ける
    • ゲームサーバーの検索は主に以下の情報でもって行われる
      • サーバーのリージョン
      • サーバーとゲームクライアントの通信品質
      • サーバーのビルドとビルド設定
  • アロケーションのリクエスト方法は3つ

    1. Game Server Hosting API を使用
    2. Game Server Hosting SDK を使用
    3. Unity Cloud Dashboard を使用

Relay with Netcode for GameObjects (NGO)

Relay with Netcode for GameObjects (NGO)

  • NGO と Relay を使ってプレイヤー間で通信を行うサンプル(あまり NGO の実装方法は触れてない)

Get started with NGO

  • NGO 側のホスト、サーバー、クライアント間での Rpc 呼び出し方法などのサンプルがまとまっている

これらを読めば Relay と NGO を使ったマルチプレイの簡単な実装ができる

ただし別ネットワーク間で通信する場合は Network Manager の Unity Transport の Allow remote connection を有効にしないといけなさそうだった

Lobby

Unity Documentation (Lobby)

プレイヤーがマルチプレイゲームにおいて他のプレイヤーを探して接続するための機能を提供するサービス

  • サービス例

    • 利用可能なゲームセッションのリストを表示し、プレイヤーがセッションを選択して参加
    • フレンドと join code を共有して自分のゲームセッションにフレンドが直接接続
    • Quick Join を使って利用可能なマッチを探して参加
    • プライベートロビーを作りゲーム内フレンドリストのフレンドを招待
    • ゲームサーバからロビーをホストし、サーバーセッションへのアクセスを管理及び制限
    • ゲームモードやタイプなどといった要求をもとににロビーをクエリ
  • プレイヤーの既存のゲームセッションへの再ジョインを可能に

  • 予期しない切断後のホストの移行を容易に

ロビーの作成

Create a lobby

いくつかのプロパティをセットして create コールを行うことでロビーが作成できる

  • プロパティ

    • ロビー名(必須)
    • 公開、非公開
    • 最大プレイヤー数
    • パスワード設定
    • カスタムロビーデータ
      • マップ ID やゲームモードなど任意のデータを含めることが可能
      • string か数値データならインデックス化してクエリ用にフィルタリングや並び替えが可能
    • ホストのプレイヤーデータ
      • 例えば名前、スキル、キャラクターなど
    • それぞれの設定方法はドキュメントを参照
  • ロビーのハートビート

    • デフォルトで30秒ホストからハートビートリクエストがないロビーは inactive になり以降はクエリの検索結果に出なくなり自動で削除される
      • このタイムアウト時間は変更が可能
      • inactivate されたロビーはロビーが更新、またはハートビートリクエストを送信することで再度 activate 可能

ビーサンプル

Unity Documentation (Game lobby sample)

Github

まだ試せてないが、規模の大きいサンプルのようで既存のプロジェクトに入れて試すというよりはリファレンスとする方が良いみたい。

Relay vs Lobby

Relay vs Lobby

Relay

  • サーバー/クライアント環境を使用してプレイヤーを P2P 方式で接続するネットワーキングソリューション
  • 専用ゲームサーバーや P2P 接続の複雑さを無視してマルチプレイヤーゲームのセッションを容易に実現

Lobby

  • ゲームセッション前のプレイヤーのグループ化と構成設定を容易にする機能
  • Lobby は P2P を使う制約はなく、また Relay を使わないでも実現可能
    • その場合は専用ゲームサーバー(DGS) を使って Lobby を使うことが可能