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 です。これには下記の内容が含まれます。
以下は、サーバー上で呼び出される NetworkLobbyManager の仮想関数です。
上記のすべてのサーバー関数は、初期値では空実装(なにも処理がない状態)になっています。ただし、PlayScene と一緒に ServerChangeScene を呼び出す OnLobbyServerPlayersReady は別です。
以下は、クライアント上に呼び出される NetworkLobbyManager 仮想関数です。
上記すべてのクライアント関数は、初期値では空実装になっています。
プレイヤーオブジェクトには2種類あり、その両方共、NetworkLobbyManager 内にプレハブ スロットを持ちます。スロットは次のスクリーンショットで確認することができます。
LobbyPlayer は、プレイヤーがロビーに参加すると LobbyPlayerPrefab から作成されます。
“Minimum Players” フィールドは、ロビーでマッチを開始するための “準備完了” のプレイヤー最小数を表します。接続しているクライアントの数が “Minimum Players” より多いときに、接続されたクライアントがすべて “準備完了” となるまで待機し、マッチを開始します。
例えば、“Minimum Players” が 2 に設定されている場合、
GamePlayer は、ゲーム開始時に GamePlayerPrefab から作成されます。
NetworkLobbyPlayer コンポーネントは LobbyPlayer オブジェクトに使用されます。カスタムのロビー挙動に使用できる仮想コールバック関数を提供します。
public virtual void OnClientEnterLobby();
public virtual void OnClientExitLobby();
public virtual void OnClientReady(bool readyState);
ゲームがロビーに入ると、クライアント上に関数 OnClientEnterLobby が呼び出されます。つまり、ロビーシーンの初回開始時とゲームプレイシーンからロビーに戻ったときです。
ゲームがロビーから出ると、クライアント上に関数 OnClientExitLobby が呼び出されます。つまりゲームプレイシーンに切り替わるときです。
該当プレイヤーのレディー状態が変更されると、クライアント上に関数 OnClientReady が呼び出されます。
NetworkLobby のマルチプレイヤーゲームへの追加手順 (マルチプレイヤーロビーアセットパッケージを使用せずに行う方法)
このバージョンの 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 を提供するサンプルプロジェクトがあります。ロビーを持ったマルチプレイヤーゲームを制作する出発点として、これを利用することもできます。