Version: 2020.2
言語: 日本語
Network Discovery
Transport Layer API の使用

Multiplayer のロビー

ノート: 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 PrefabGame Player Prefab です。それぞれに対し、Network Lobby Manager コンポーネントにフィールドがあります。

Network Lobby Manager コンポーネント

Lobby Player Prefab

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 メソッドが呼び出されます。

Game Player Prefab

ゲームは、すべてのプレイヤーが準備完了であることを示すと開始されます。ゲームが始まると、Unity は Game Player Prefab に基づいて各プレイヤーのゲームオブジェクトを作成します。ゲーム終了時にプレイヤーがロビーに再入室したときに、これらのゲームオブジェクトは破棄されます。Game Player Prefab は、ゲーム中にコマンドを処理します。このプレハブは、標準的なネットワーク化されたゲームオブジェクトで、Network Identity コンポーネント がアタッチされている必要があります。

Minimum Players

Network Lobby Manager コンポーネントで Minimum Players フィールドはゲーム開始前に準備完了にならなくてはならない最小プレイヤー数を意味します。接続したクライアント数が Minimum Players 値に達すると、接続しているすべてのクライアントがマッチを開始する準備が完了するのを待機します。

例えば、Minimum Players が 2 に設定されている場合は

  • ゲームの 1 つのインスタンスを開始し、ホストモードでゲームを開始します。 次に、ゲームのロビーインターフェースで、自身のプレイヤーのために Start を押します。ゲームを開始する準備ができているプレイヤーの最小数が 2 であるため、自身はまだロビーにいます。
  • さらに 2 つのゲームインスタンスを開始し、それらのインスタンスでクライアントモードでゲームを開始します。接続しているすべてのプレイヤー (この例では 3 人) の準備が完了するのを待ちます。 1 人のプレイヤーのロビー UI で Start を押します。現在、2 人のプレイヤーが準備はできていますが、まだロビーにいます。最後のプレイヤーのロビー UI で Start を押すと、すべてのプレイヤーがメインのゲームシーンに移動します。

ロビーをゲームに加える

以下は、Unity のビルトインのネットワーク機能を使って Network Lobby をマルチプレイヤーゲームに加える基本的な手順です。

  • ロビーのための空のシーンを作成します
  • 空のシーンを Build Settings (File > Build Settings… > Add Open Scenes) に最初のシーンとして加えます
  • 新しいシーンに新しいゲームオブジェクトを作成し、LobbyManager という名前に変更します
  • Network Lobby Manager コンポーネントを LobbyManager ゲームオブジェクトに加えます
  • Network Manager HUD コンポーネントを LobbyManager ゲームオブジェクトに加えます
  • インスペクターを開いて Network Lobby Manager コンポーネントを表示します
  • Network Lobby Manager コンポーネントで、 Lobby SceneLobbyManager ゲームオブジェクトを含むシーンを設定します
  • Network Lobby Manager コンポーネントで、 Play Scene にゲームのメインメニューシーンを設定します
  • 新しいゲームオブジェクトを作成し、それを LobbyPlayer と名前に変更します
  • Network Lobby Player コンポーネントを LobbyPlayer に加えます
  • LobbyPlayer ゲームオブジェクトのプレハブを作成し、シーンからそのインスタンスを削除します
  • LobbyPlayerPrefab フィールド (Network Lobby Manager インスペクター内) に LobbyPlayer プレハブを設定します
  • GamePlayerPrefab フィールド (Network Lobby Manager インスペクター内) にメインのゲームプレイシーンのプレイヤーのプレハブを設定します
  • シーンを保存します
  • ゲームを実行します

このバージョンの 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 を参照してください。

Network Discovery
Transport Layer API の使用