多くのマルチプレイヤーゲームには、プレイヤーが実際のゲームをプレイする前に参加する、集まる場所があります。しばしば「ロビー」と呼ばれるこのエリアでは、プレイヤーは各種オプション選択など、ゲームを開始に向けての準備を行います。
NetworkLobbyManager は、Unity のマルチプレイヤーゲームにロビーを提供するための専用の NetworkManager です。これには下記の内容が含まれます。
GuiLobbyManager は、ロビーのユーザーインターフェースを提供する、特殊なロビー管理プログラムです。アセット・パッケージとして提供され、これを Unity プロジェクトにインポートすることでマルチプレイヤーゲームに簡単にロビーを追加することができます。パッケージに含まれるスクリプトと UI プレハブはカスタマイズ可能で、さまざまなゲームに合わせてロビーの見た目や雰囲気を自由に変えることができます。
以下は、サーバー上で呼び出される 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 を提供するサンプルプロジェクトがあります。ロビーを持ったマルチプレイヤーゲームを制作する出発点として、これを利用することもできます。