tanaka's Programming Memo

プログラミングについてのメモ。

Unity5.1 ネットワークシステム Multiplayer Lobby

前へ | 次へ

UNet Unity5.1からの新しいネットワークシステム
Unity5.1のネットワークマニュアル斜め読み(2)
UNet NetworkManagerの利用
Unity5.1 ネットワークシステムのオブジェクト生成
Unity5.1 ネットワークシステムの状態同期
Unity5.1 ネットワークシステムのRemote Actions
Unity5.1 ネットワークシステム PlayerObjects
Unity5.1 ネットワークシステム Object Visibility
Unity5.1 ネットワークシステム Network Messages
Unity5.1 ネットワークシステム Matchmaker
Unity5.1 ネットワークシステム Scene Objects
Unity5.1 ネットワークシステム:シングルプレイヤーゲームを多人数に対応させる
Unity5.1 ネットワークシステム Multiplayer Lobby
Unity5.1 ネットワークシステム Network Clients and Servers
Unity5.1 ネットワークリファレンス概要

公式サイトの以下のページの斜め読みメモです。
Unity - マニュアル: Multiplayer Lobby

Multiplayer Lobby

多くのマルチプレイヤーゲームでは、ゲームに参加して実際に遊ぶ前のステージが用意されています。このステージはしばしば"lobby"と呼ばれ、選択肢などでゲームの準備をすることができます。

NetworkLobbyManagerはUnityのマルチプレイヤーゲームのためのlobbyを提供することに特化したNetworkManagerです。これらは以下の機能を持ちます。

  • 参加できるプレイヤーの上限人数を設定
  • 1クライアントに複数のプレイヤーが参加することに対応し、クライアントごとに参加できるプレイヤーの上限を設定
  • 進行中のゲームにプレイヤーが参加するのを防ぐ
  • プレイヤーごとに準備状態を持ち、すべてのプレイヤーの準備が整ったところでゲームを開始
  • プレイヤーごとに設定データを持つ
  • ゲームが終わったらlobbyに戻す
  • lobbyのイベントの仮装関数が用意されており、独自の手順を実現できる

GuiLobbyManagerはロビーのためのUIを提供する特殊なlobbyマネージャーです。これはアセットパッケージとして提供されていて、Unityのマルチプレイヤーゲームにlobby機能を簡単に追加することができます。パッケージに含まれるスクリプトとUIのプレハブはカスタマイズができるので、多様なゲームのlobbyとして見た目や操作感を作り込むことができます。

Lobby Player Objects

2種類のプレイヤー用のオブジェクトがあり、NetworkLobbyManagerにはそれらを設定するprefab slotがあります。

LobbyPlayer Object
  • 全プレイヤーが利用する
  • クライアントが接続したり、プレイヤーが追加されたりした時に作成される
  • 切断されるまで存在する
  • lobbyのためのプレイヤーの準備が整ったかのフラグを持つ
  • lobbyにいる間、Commandsを制御
  • ゲームが設定するプレイヤーデータを保持するためのユーザースクリプトを追加する
GamePlayer Object
  • 全プレイヤーが利用する
  • ゲームシーンが開始すると作成される
  • lobbyに戻るとdestroyされる
  • ゲーム中のCommandsを制御

NetworkLobbyPlayerコンポーネントは、LobbyPlayerオブジェクトのために利用されます。このコンポーネントは、lobbyの振る舞いをカスタマイズするのに利用できるいくつかの仮装関数のコールバックを提供します。

以下、公式サイトからの転載です。

    public virtual void OnClientEnterLobby()
    {
    }

    public virtual void OnClientExitLobby()
    {
    }

    public virtual void OnClientReady(bool readyState)
    {
    }

ゲームへのlobbyの追加(Adding the Lobby to a Game)

多人数ゲームへのNetworkLobbyの追加手順です(multiplayer-lobbyアセットパッケージを利用しない時の例です)。

  • 新しいlobbyシーンを作成
  • [File]>[Build Settings]で、作成したシーンを最初のシーンとして追加
  • 新しいシーンに新しいゲームオブジェクトを作成して、LobbyManagerという名前に変更
  • 作成したLobbyManagerオブジェクトにNetworkLobbyManagerコンポーネントを追加
  • 同様にNetworkManagerHUDコンポーネントを追加
  • NetworkLobbyManagerコンポーネントのインスペクターを開く
  • current scene欄にLobbySceneを設定
  • ゲームのメインシーンをPlayScene欄に設定
  • 新しいゲームオブジェクトを作成して、LobbyPlayerに名前を変更
  • 作成したLobbyPlayerオブジェクトにNetworkLobbyPlayerコンポーネントを追加
  • LobbyPlayerのプレハブを作成して、シーンのインスタンスは削除
  • LobbyPlayerプレハブをLobbyPlayerPrefab欄に設定
  • メインゲームに登場させるプレイヤーのプレハブをGamePlayerPrefab欄に設定
  • シーンを保存
  • ゲームを実行

NetworkLobbyManagerのこのバージョンでは、NetworkManagerGUIのようなOnGUIを使ってUIを提供しています。multiplayer-lobbyアセットパッケージを利用するとUIはより良くなります。

NetworkLobbyManagerはlobbyの動作をカスタマイズするのに利用できるコールバック仮装関数をいくつか持っています。もっとも重要なのは、lobbyからゲームに切り替わる際にすべてのプレイヤーごとにサーバーで呼ばれる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;
    }


前へ | 次へ