重要: UNet は非推奨のソリューションになり、現在、新しい Multiplayer とネットワーキングソリューション (Netcode for GameObjects) が開発中です。詳細は、GameObjects Web サイトの Unity Netcode を参照してください。 |
大抵のマルチプレイヤーゲームは「ロビー」を持っています。これは、実際にゲームをする前にプレイヤーが集まるゲームのシーンです。ロビーでは、プレイヤーはオプションを選択し、ゲームを始める準備をします。
Unity は、ゲームに簡単にロビーを実装する手段として Network Lobby Manager コンポーネント を提供しています。
Network Lobby Manager コンポーネントは Unity Multiplayer ゲーム用にロビーを提供します。Network Lobby Manager コンポーネントには以下の機能が含まれます。
以下は Network Lobby Manager 仮想メソッドです。詳しくは、スクリプトリファレンスの NetworkLobbyManager クラスを参照してください。呼び出しするメソッドは、クライアントとサーバーで別々にリストされています。イベントの発生時に操作を行うために、これらのメソッドに独自の実装を行うことができます。
以下は、サーバー 上で呼び出される NetworkLobbyManager
仮想メソッドです。
以下は、クライアント 上で呼び出される NetworkLobbyManager
仮想メソッドです。
上に挙げたすべてのサーバーとクライアントのメソッドには、OnLobbyServerPlayersReady
を除いてデフォルトの空の実装があります。OnLobbyServerPlayersReady
は PlayScene (Lobby Manager インスペクターの Play Scene フィールドに割り当てられるシーン) をパラメーターに取る ServerChangeScene を呼び出します。
Lobby Manager には 2 種類のプレイヤープレハブがあります。Lobby Player Prefab と Game Player Prefab です。それぞれに対し、Network Lobby Manager コンポーネントにフィールドがあります。
Network Lobby Manager コンポーネント
Lobby Player Prefab フィールドに割り当てるプレハブには Network Lobby Player コンポーネント がアタッチされている必要があります。ロビーに集まる各クライアントは Game Player Prefab から作られた新しいロビープレイヤーゲームオブジェクトを取得します。クライアントが接続すると Unity はロビープレイヤーゲームオブジェクトを作成し、それはクライアントが接続を切るまで存在します。
Network Lobby Player コンポーネントは各プレイヤーの「準備完了」状態を保持し、それらがロビーに存在する間、コマンドを処理します。プレハブにユーザースクリプトを加え、ゲーム特有のプレイヤーデータを保持することができます。
Network Lobby Player コンポーネントは、カスタムのロビー挙動に使用するいくつかの仮想メソッドコールバックを提供します。
public virtual void OnClientEnterLobby();
public virtual void OnClientExitLobby();
public virtual void OnClientReady(bool readyState);
プレイヤーがロビーに入るとき、クライアント上で OnClientEnterLobby メソッドが呼び出されます。これは、ロビーシーンが初めて開始するときと、ゲームプレイシーンからロビーに戻るときに発生します。
プレイヤーがロビーを退出するとき、クライアント上で OnClientEnterLobby メソッドが呼び出されます。これは、ゲームプレイシーンに替わるときに発生します。
プレイヤーの準備状態が変わるとき、クライアント上で OnClientReady メソッドが呼び出されます。
ゲームは、すべてのプレイヤーが準備完了であることを示すと開始されます。ゲームが始まると、Unity は Game Player Prefab に基づいて各プレイヤーのゲームオブジェクトを作成します。ゲーム終了時にプレイヤーがロビーに再入室したときに、これらのゲームオブジェクトは破棄されます。Game Player Prefab は、ゲーム中にコマンドを処理します。このプレハブは、標準的なネットワーク化されたゲームオブジェクトで、Network Identity コンポーネント がアタッチされている必要があります。
Network Lobby Manager コンポーネントで Minimum Players フィールドはゲーム開始前に準備完了にならなくてはならない最小プレイヤー数を意味します。接続したクライアント数が Minimum Players 値に達すると、接続しているすべてのクライアントがマッチを開始する準備が完了するのを待機します。
例えば、Minimum Players が 2 に設定されている場合は
以下は、Unity のビルトインのネットワーク機能を使って Network Lobby をマルチプレイヤーゲームに加える基本的な手順です。
このバージョンの Network Lobby Manager は非常に基本的な実装で、Network Manager HUD のようなプレースホルダーのユーザーインターフェースを使用しています。ゲームをリリースする前に、ゲームのビジュアルデザインと機能要件に合った独自のユーザーインターフェースに置き換える必要があります。
ユーザーインターフェースの例は、Unity Asset Store で入手可能な マルチプレーヤーロビーの Asset Store パッケージ を参照してください。
NetworkLobbyManager クラスには、カスタムのロビー挙動のための多くの仮想関数コールバックがあります。最も重要な機能は OnLobbyServerSceneLoadedForPlayer で、各プレーヤーがロビーからゲームのプレイシーンに移行するときにサーバー上で呼び出されます。これは、ロビーゲームオブジェクトからプレイヤーゲームオブジェクトに設定を適用するのに理想的なタイミングです。
// ロビーのプレイヤーゲームオブジェクトからゲームシーンのプレイヤーゲームオブジェクトに設定を適用します
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 Asset Store には Network Lobby Manager を使って ロビーの GUI を提供するサンプルプロジェクトがあります。まず、これを利用してマルチプレイヤーゲームの独自のロビーを作成するとよいでしょう。詳しくは Asset Store: Lobby Sample Project を参照してください。