Version: 5.5
シングルプレイヤーゲームを Unity Multiplayer に変換
ネットワークのクライアントとサーバー

ロビー

Many multiplayer games have a staging area (often known as a “lobby”) for players to join before playing the actual game. In this area, players can pick options and set themselves as ready for the game to start.

NetworkLobbyManager は、Unity のマルチプレイヤーゲームにロビーを提供するための専用の NetworkManager です。これには下記の内容が含まれます。

  • 参加できるプレイヤーの人数制限
  • 1つのクライアントで操作可能なプレイヤー数の制限を持つ、クライアントごとのマルチプレイヤーをサポート
  • 進行中ゲームへのプレイヤーの参加の防止
  • 全プレイヤーの準備完了を待ってゲームを開始するための、プレイヤーごとの準備状態の管理
  • プレイヤーごとの設定データ
  • ゲーム終了時のロビーへの再参加
  • ロビーイベント用にカスタムロジックを使用可能にする仮想関数
  • ロビーで操作を行うための簡単なユーザー・インターフェース

以下は、サーバー上で呼び出される NetworkLobbyManager の仮想関数です。

上記のすべてのサーバー関数は、初期値では空実装(なにも処理がない状態)になっています。ただし、PlayScene と一緒に ServerChangeScene を呼び出す OnLobbyServerPlayersReady は別です。

以下は、クライアント上に呼び出される NetworkLobbyManager 仮想関数です。

上記すべてのクライアント関数は、初期値では空実装になっています。

ロビー プレイヤー オブジェクト

プレイヤーオブジェクトには2種類あり、その両方共、NetworkLobbyManager 内にプレハブ スロットを持ちます。スロットは次のスクリーンショットで確認することができます。

LobbyPlayer は、プレイヤーがロビーに参加すると LobbyPlayerPrefab から作成されます。

  • 各プレイヤーにひとつの LobbyPlayer
  • クライアント接続時またはプレイヤー追加時に作成される
  • クライアントの接続が断たれるまで存在し続ける
  • ロビー用に、該当プレイヤーの準備フラグを持つ
  • ロビー内におけるコマンドを扱う
  • 各ゲーム固有のプレイヤーデータを持たせるために該当プレハブにユーザースクリプトを追加する
  • このプレハブは NetworkLobbyPlayer コンポーネントを1つ持つ必要があります。

Minimum Players

“Minimum Players” フィールドは、ロビーでマッチを開始するための “準備完了” のプレイヤー最小数を表します。接続しているクライアントの数が “Minimum Players” より多いときに、接続されたクライアントがすべて “準備完了” となるまで待機し、マッチを開始します。

例えば、“Minimum Players” が 2 に設定されている場合、

  • ゲームとホストのインスタンスを1つ生成します。そのときにゲームのロビーUIでプレイヤーは “Start” ボタンを押します。ゲームを開始するために必要な準備完了状態の最小プレイヤー数は2なので、まだロビーモードのままとなります。
  • 2つ以上のゲームのインスタンスを生成し、さらに複数のクライアントを起動します。このとき、“Minimum Players” が2に設定されていても関係がなく、すべてのプレイヤー(例えば3人プレイヤーがいれば3人とも)準備完了状態になるまでまたなくてはいけません。
  • 1人のプレイヤーがロビー UI の “Start” ボタンを押します。2人のプレイヤーは準備完了となりますが、まだロビーモードです。最後のプレイヤーが(つまり全員が) “Start” ボタンを押すとゲームモードに移動します。

GamePlayer

GamePlayer は、ゲーム開始時に GamePlayerPrefab から作成されます。

  • 各プレイヤーにひとつの GamePlayer
  • ゲームシーンの開始時に作成される
  • ロビーに再入場すると破棄される
  • ゲーム中におけるコマンドを扱う
  • このプレハブは NetworkIdentity コンポーネントを1つ持つ必要があります。

NetworkLobbyPlayer コンポーネントは LobbyPlayer オブジェクトに使用されます。カスタムのロビー挙動に使用できる仮想コールバック関数を提供します。

    public virtual void OnClientEnterLobby();
        public virtual void OnClientExitLobby();
        public virtual void OnClientReady(bool readyState);

ゲームがロビーに入ると、クライアント上に関数 OnClientEnterLobby が呼び出されます。つまり、ロビーシーンの初回開始時とゲームプレイシーンからロビーに戻ったときです。

ゲームがロビーから出ると、クライアント上に関数 OnClientExitLobby が呼び出されます。つまりゲームプレイシーンに切り替わるときです。

該当プレイヤーのレディー状態が変更されると、クライアント上に関数 OnClientReady が呼び出されます。

ロビーのゲームへの追加

NetworkLobby のマルチプレイヤーゲームへの追加手順 (マルチプレイヤーロビーアセットパッケージを使用せずに行う方法)

  • ロビーシーンを作成します。
  • シーンを、一番目のシーンとしてビルド設定に追加します。
  • 新規シーン内でゲームオブジェクトを作成し、その名前を LobbyManager に変更します。
  • NetworkLobbyManager コンポーネントを LobbyManager オブジェクトに追加します。
  • NetworkManagerHUD コンポーネントを LobbyManager オブジェクトに追加します。
  • NetworkLobbyManager コンポーネントのインスペクターを開きます。
  • LobbyManager オブジェクトを含むシーンを NetworkLobbyManager コンポーネントの LobbyScene スロットに設定します。
  • ゲームのメインゲームシーンに、NetworkLobbyManager の PlayScene スロットを設定します。
  • gameObject を新規作成し、名前を LobbyPlayer に変更します。
  • NetworkLobbyPlayer コンポーネントを LobbyPlayer に追加します。
  • LobbyPlayer のプレハブを作成し、インスタンスをシーンから削除します。
  • LobbyPlayerPrefab スロットを LobbyPlayer プレハブに設定します。
  • GamePlayerPrefab スロットをメインゲームのプレイヤーのプレハブに設定します。
  • シーンを保存します。
  • ゲームを起動します。

このバージョンの NetworkLobbyManager は NetworkManagerHUD のような OnGUI ユーザーインターフェースを使用しています。より高度なユーザーインターフェースを使用したい場合はマルチプレイヤーロビー アセットパッケージを使用してください。

NetworkLobbyManager には、カスタムのロビー挙動に使用できる数多くの仮想コールバック関数が含まれています。中でももっとも重要なものが OnLobbyServerSceneLoadedForPlayer です。これは、各プレイヤーがロビーからメインゲームに移行する際に、そのそれぞれに対してサーバーに呼び出されるものです。ロビーからの設定をプレイヤーのゲームプレイオブジェクトに対して適用するのに最適です。

    // for users to apply settings from their lobby player object to their in-game player object
    public override bool OnLobbyServerSceneLoadedForPlayer(GameObject lobbyPlayer, GameObject gamePlayer)
    {
        var cc = lobbyPlayer.GetComponent<ColorControl>();
        var player = gamePlayer.GetComponent<Player>();
        player.myColor = cc.myColor;
        return true;
    }

サンプルプロジェクト

Unity アセットストアに、NetworkLobbyManager を使用してロビー用の GUI を提供するサンプルプロジェクトがあります。ロビーを持ったマルチプレイヤーゲームを制作する出発点として、これを利用することもできます。

ロビーのサンプルプロジェクト

シングルプレイヤーゲームを Unity Multiplayer に変換
ネットワークのクライアントとサーバー