tanaka's Programming Memo

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

UNet NetworkManagerの利用

前へ | 次へ

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 - マニュアル: Using the NetworkManager

NetworkManagerの利用

NetworkManagerは、多人数ゲームのネットワークの状況を管理するコンポーネントです。HLAPIで実装されており、開発者は使い方を理解する必要がありますが、数多くの便利な機能が一箇所にまとまっているので、実行したり、多人数プレイヤーをデバッグしたりすることが簡単にできます。

NetworkManagerはスクリプトなしで利用できます。Inspectorビューにすべての機能が表示され、NetworkManagerHUDを使うと、多人数ゲームを制御するのに必要な実行時のデフォルトインターフェースが提供されます。NetworkManagerと、用意されている仮想関数をオーバーライドすることで、機能をカスタマイズすることもできます。

NetworkManagerの機能は以下の通りです。

  • ゲーム状態(Game State)の管理
  • ゲームオブジェクトの出現管理
  • シーンの管理
  • デバッグ用の情報提供
  • マッチメイキング(参加者の募集と接続)
  • カスタマイズ

NetworkManagerの利用方法

NetworkManagerは多人数ゲームを制御することができるコンポーネントです。以下の手順で設定します。

  • 空のゲームオブジェクトを作成するか、ゲームの制御用のゲームオブジェクトを選択
  • [Inspector]ビューの[Add Component]で、[Network]>[NetworkManager]を選択して追加

以上で、NetworkManagerコンポーネントのInspectorで、ネットワークが制御できるようになります。

NetworkManagerHUDコンポーネント

NetworkManagerHUDはNetworkManagerと一緒に動作するコンポーネントです。ネットワークに接続したり、状態を操作するための簡易なユーザーインターフェースを提供してくれます。これによりすぐにネットワークプロジェクトを試すことができますが、完成したゲームにそのまま組み込むことを意図したものではありません。

ここで提供されるのは最低限の見た目のもので、カスタマイズすることで本格的な見た目にできます。

  • NetworkManagerコンポーネントを追加したのと同じゲームオブジェクトの[Add Component]をクリックして、[Network]>[NetworkManagerHUD]を選択して追加

実行して、ネットワークが使えるようになるとHUDが表示されます(HUDはHead Up Displayの略でヘッズなどと発音します。ゲームでのHUDは、画面上に重ねるユーザーインターフェースを指します)。

ゲームの状態管理(Game State Management)

UNetによるマルチプレイヤーゲームは3つのモードで動かすことができます。すなわち、クライアント、専用サーバー、クライアントとサーバーを同時に担当するホストの3つのモードです。UNetは、これらすべてのモードのコードを同じコードとアセットで開発できるように設計されています。一人用のバージョンとマルチプレイヤーバージョンの開発を同じように行えます。

NetworkManagerは3つのモードそれぞれに参加するために、NetworkManager.StartClient()、NetworkManager.StartServer()、そしてNetworkManager.StartHost()のメソッドが用意されています。これらのメソッドスクリプトコードから呼べるので、キー入力や自作のユーザーインターフェースから実行することができます。任意に表示できるデフォルトの実行時の操作も同じ動作をします。実行時にNetworkManagerHUDのインスペクターに表示されるボタンも同様です。

ゲーム状態の変更に使われるメソッドでは、networkAddressとnetworkPortプロパティーが利用されます。サーバーやホストがゲームを開始すると、networkPortに設定したポートで待機します。クライアントが開始されると、networkAddressの機器のnetworkPortに接続します。

出現管理(Spawning Manager)

NetworkManagerは、プレハブからネットワーク上のオブジェクトの生成に利用されます。多くのゲームにはプレイヤーオブジェクトとして利用されるプレハブがあります。NetworkManagerにはそのプレイヤー用のプレハブを設定する欄があります。Player Prefab欄にプレハブが設定されていた場合、ゲームが開始するとそのプレハブが開始したプレイヤー用のゲームオブジェクトとしてゲーム内に自動的に登場します。ホストされているサーバー上ではローカルプレイヤー、リモートクライアント上ではリモートプレイヤーになります。プレイヤープレハブは、NetworkIdentityコンポーネントを持っている必要があります。

プレイヤープレハブは、クライアントのシーンに登録された動的なオブジェクトを生成することもできます。ClientScene.RegisterPrefab()関数で実行するか、NetworkManagerにより自動的に行われます。NetworkManagerのSpawn Info欄のSpawnリストに追加したプレハブは、自動的に生成されます。

プレイヤープレイハブをNetworkManagerのInspectorに設定して、ホストとしてゲームを開始するとプレイヤーオブジェクトが生成されるのが確認できます。ゲームを停止するとプレイヤーオブジェクトは破棄されます。ゲームのコピーをもう一つ実行してクライアントとしてゲームに参加するとプレイヤーオブジェクトが増えます。クライアントを終了すると追加されたプレイヤーが消えます。

プレイヤーオブジェクトは、NetworkManager.OnServerAddPlayer()のデフォルトの実装によって生成されます。もし、プレイヤーオブジェクトの生成方法を変更したい場合は仮装関数を上書きすることができます。デフォルトの実装は以下のとおりです(公式サイトより抜粋)

public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
{
    var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
    NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
}

NetworkServer.AddPlayerForConnection()関数は、新しく作成したプレイヤーオブジェクトを渡して呼びます。これによって、接続されている先のクライアントにもオブジェクトが生成されて管理されます。この動作だけでオブジェクトが生成されるので、NetworkServer.Spawnをプレイヤーオブジェクトのために呼び出す必要はありません。

開始座標(Start Positions)

プレイヤーをどこに出現させるかを制御したい時は、NetworkStartPositionコンポーネントを利用します。NetworkManagerはシーン内からNetworkStartPositionを持ったオブジェクトを探し、複数見つかった場合はそのうちの一つの場所と向きにプレイヤーを生成します。NetworkManager.startPositionsでNetworkStartPositionのリストを確認できるので、それを利用して独自のコードを作成することもできます。また、NetworkManager.GetStartPosition()関数を使うと、OnServerAddPlayer()関数内からStart Positionを見つけることもできます。

シーン管理(Scene Management)

多くのゲームは複数のシーンを持ちます。もっとも簡素な例として、ゲームを遊ぶ以外のシーンとして、タイトルやメニューから開始するシーンを持つでしょう。NetworkManagerはマルチプレイヤーゲームのためのシーンの状態管理とシーンの切り替えを自動的に行います。NetworkManagerのインスペクターにはofflineSceneとonlineSceneを設定する2つの欄があります。これらの欄にシーンオブジェクトをドラッグ&ドロップすることで機能が有効になります。

サーバーやホストが起動するとonline sceneが読み込まれ、実行シーンとして切り替わります。サーバーに接続されている全てのクライアントでもそのシーンに切り替わります。シーンの名前はnetworkSceneNameプロパティに設定されます。

サーバーやホスト停止したり、クライアントがネットワークから切断するなどしてネットワークが停止すると、offline sceneが読み込まれます。これによりネットワークが切断したら、マルチプレイヤーゲームからタイトルやメニュー画面に自動的に切り替えてくれます。

ゲーム中にNetworkManager.ServerChangeScene()を呼び出すことでシーンを切り替えることもできます。これにより接続している全てのクライアントのシーンの変更も開始されて、networkSceneNameが更新されて、新しいシーンが読み込まれます。

ネットワーク上のシーン管理が有効な間、NetworkManager.StartHost()やNetworkManager.StopClient()といったゲーム状態を呼び出すことで状態を変更できます。ランタイムUIも同様です。シーンを設定してこれらの関数を呼び出すことで簡単にマルチゲームプレイヤーのシーンの流れを操作できます。

シーンを切り替えると、シーン内の全てのオブジェクトが破棄されます。これはNetworkManagerも含むので注意が必要です。もし全てのシーンで共通のNetworkManagerを利用したい場合は、"Dont Destroy On Load"の設定にチェックを入れてtrueにしてください。簡易なシステムの場合はこの設定をしておくと便利です。ただし、NetworkManagerがシーンごとに用意できるということは、シーンごとに読み込むプレハブを変更したり、異なるシーンへの切り替えをすることができるということなので、適宜判断するとよいでしょう。

デバッグ用情報(Debugging Information)

NetworkManagerHUDのインスペクターパネルで、実行時のネットワーク状態についての追加的な情報を見ることができます。

  • ネットワーク接続
  • 有効なサーバーのNetworkIdentityオブジェクト
  • 有効なクライアントのNetworkIdentityオブジェクト
  • 接続しているクライアントの情報

また、登録したクライアントのメッセージハンドラーが示されます。

マッチメイキング(Matchmaking)

NetworkManagerの実行時やインスペクターのユーザーインターフェースで、マッチメイキングサーバーにアクセスできます。NetworkManager.StartMatchmaker()関数でマッチメイキングを開始して、NetworkMatchオブジェクト型のNetworkManager.matchmakerプロパティーでエントリーできます。デフォルトのユーザーインターフェースとNetworkManagerのコールバック関数によって、簡易なマッチメイキングができます。

NetworkManagerのそれらの機能は仮装関数で用意されているので、マッチメーカーからの戻り値への振る舞いをカスタマイズできます。

カスタマイズ(Customization)

NetworkManagerに実装されている仮装関数を利用して振る舞いをカスタマイズできます。これらの関数をオーバーライドする場合は、デフォルトの挙動で行っていた重要な機能を引き継ぐ必要があります。例えばOnServerAddPlayer()は、NetworkServer.AddPlayer()を呼び出して接続先にプレイヤーを有効にする必要があります。

デフォルトの仮装関数の実装は「Unity - マニュアル: Using the NetworkManager」で確認してください。


前へ | 次へ