Version: 5.4
シングルプレイヤーゲームをマルチプレイへ変換する
ネットワークのクライアントとサーバー

ロビー

多くのマルチプレイヤーゲームには、プレイヤーが実際のゲームをプレイする前に集まる場所があります。しばしば「ロビー」と呼ばれるこのエリアでは、プレイヤーは各種オプション選択などゲーム開始に向けての準備を行います。

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 を提供するサンプルプロジェクトがあります。ロビーを持ったマルチプレイヤーゲームを制作する出発点として、これを利用することもできます。

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

シングルプレイヤーゲームをマルチプレイへ変換する
ネットワークのクライアントとサーバー