ノート: UNet は非推奨となり、今後 Unity から削除される予定です。新しいシステムが開発中です。詳細は ブログ と FAQ を参照してください。 |
大抵のマルチプレイヤーゲームは「ロビー」を持っています。これは、実際にゲームをする前にプレイヤーが集まるゲームのシーンです。ロビーでは、プレイヤーはオプションを選択し、ゲームを始める準備をします。
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 で入手可能な Network Lobby を参照してください。
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 を参照してください。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.