シングルプレイヤーゲームを Unity Multiplayer に変換
ネットワークのクライアントとサーバー

Multiplayer のロビー

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.

The NetworkLobbyManager is a specialized NetworkManager that provides a lobby for Unity Multiplayer games. Its functionality includes the following:

  • 参加できるプレイヤー数を制限します
  • Supports multiple players per client, with a limit on the number of players per client
  • Prevents players from joining game in-progress
  • Has a per-player ready state, so that the game starts when all players are ready
  • Has per-player configuration data
  • Allows re-joining the lobby when the game is finished
  • ロビーイベント用にカスタムロジックを使用可能にする仮想関数
  • ロビーで操作を行うための簡単なユーザー・インターフェース

以下は、サーバー上で呼び出される NetworkLobbyManager の仮想関数です。

All of the above server functions have empty default implementations, except for OnLobbyServerPlayersReady, which calls ServerChangeScene with the PlayScene.

以下は、クライアント上に呼び出される NetworkLobbyManager 仮想関数です。

上記すべてのクライアント関数は、初期値では空実装になっています。

Lobby player objects

There are two kinds of player objects, each of which has a Prefab slot in the NetworkLobbyManager. The slots can be seen in this screenshot:

LobbyPlayer は、プレイヤーがロビーに参加すると LobbyPlayerPrefab から作成されます。

  • 各プレイヤーにひとつの LobbyPlayer
  • クライアント接続時またはプレイヤー追加時に作成される
  • クライアントの接続が断たれるまで存在し続ける
  • ロビー用に、該当プレイヤーの準備フラグを持つ
  • ロビー内におけるコマンドを扱う
  • 各ゲーム固有のプレイヤーデータを持たせるために該当プレハブにユーザースクリプトを追加する
  • このプレハブは NetworkLobbyPlayer コンポーネントを1つ持つ必要があります。

Minimum Players

The Minimum Players field represents the minimum number of “Ready” players in the Lobby to start the Match with. If the number of connected clients is more than the “Minimum Players” value, then waiting for all connected clients to become “Ready” starts the Match.

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

  • Start one instance of the game and start Host. Then in game Lobby UI press Start for your player. You are still in Lobby mode, because the minimum number of Ready players to start the game is 2.
  • Start two more instances of the game, and start Clients there. It doesn’t matter that “Minimum Players” set to 2. Wait for all connected players to become Ready.
  • Press Start in Lobby UI for one player. Two players are Ready, but still in Lobby mode. Press “Start” in the Lobby UI for the last player, and all players are moved to Game mode.

GamePlayer

GamePlayer は、ゲーム開始時に GamePlayerPrefab から作成されます。

  • 各プレイヤーにひとつの GamePlayer
  • Created when game Scene is started
  • ロビーに再入場すると破棄される
  • ゲーム中におけるコマンドを扱う
  • This Prefab must have a NetworkIdentity component

NetworkLobbyPlayer コンポーネントは LobbyPlayer オブジェクトに使用されます。カスタムのロビー挙動に使用できる仮想コールバック関数を提供します。

    public virtual void OnClientEnterLobby();
        public virtual void OnClientExitLobby();
        public virtual void OnClientReady(bool readyState);

The function OnClientEnterLobby is called on the client when the game enters the lobby. This happens when the lobby Scene starts for the first time, and also when returning to the lobby from the gameplay Scene.

The function OnClientExitLobby is called on the client when the game exits the lobby. This happens when switching to the gameplay Scene.

該当プレイヤーのレディー状態が変更されると、クライアント上に関数 OnClientReady が呼び出されます。

Adding the lobby to a game

NetworkLobby のマルチプレイヤーゲームへの追加手順 (マルチプレイヤーロビーアセットパッケージを使用せずに行う方法)

  • Create a new lobby Scene
  • Add the Scene to the Build Settings (menu: File > Build Settings…), as the first Scene
  • Create a new GameObject in the new Scene (menu: GameObject > Create Empty), and name it LobbyManager
  • Add the NetworkLobbyManager component to the LobbyManager GameObject
  • Add the NetworkManagerHUD component to the LobbyManager GameObject
  • In the Inspector window for the NetworkLobbyManager component, set the Lobby Scene slot of the NetworkLobbyManger to the Scene that contains the LobbyManager GameObject
  • Set the Play Scene slot of the NetworkLobbyManager to the main gameplay Scene for the game
  • Create a new GameObject and name it LobbyPlayer
  • Add the NetworkLobbyPlayer component to the LobbyPlayer
  • Create a Prefab for the LobbyPlayer (drag it into the Project window), and delete the instance from the Scene
  • On the LobbyManager’s NetworkLobbymanager component, assign the LobbyPlayer prefab to the Lobby Player Prefab slot
  • Assign the Prefab for the player in the main game to the Game Player Prefab slot
  • シーンを保存します
  • ゲームを起動します。

This version of the NetworkLobbyManager uses the OnGUI user interface like the NetworkManagerHUD. For a better user interface, use the multiplayer-lobby Asset package (found in the NetworkStarter sample package, on the Unity forums).

The NetworkLobbyManager has many virtual function callbacks that can be used for custom lobby behaviour. The most important is OnLobbyServerSceneLoadedForPlayer, which is called on the server for each player as they transition from the lobby to the main game. This is the ideal place to apply settings from the lobby to the player object.

    // 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;
    }

Sample project

Unity アセットストアに、NetworkLobbyManager を使用してロビー用の GUI を提供するサンプルプロジェクトがあります。ロビーを持ったマルチプレイヤーゲームを制作する出発点として、これを利用することもできます。

ロビーのサンプルプロジェクト

シングルプレイヤーゲームを Unity Multiplayer に変換
ネットワークのクライアントとサーバー