Unity Multiplayer Networking入門<基本編>

タイトル通りです.Unityでマルチプレイヤーゲームを作成するのに最低限必要な要素を備忘録的に記します.下記チュートリアルを読むこと必至です.

unity3d.com

Network Manager

 Network Managerはゲームのネットワーク状態を管理するコンポーネントです.

プロパティー: 説明:
playerPrefab クライアントが接続されたときにプレイヤーをインスタンス化するためのプレハブ
playerSpawnMethod Random を選ぶとランダムに選択した startPositions にプレイヤーを生成します。 Round Robin を選ぶと設定リストの startPositions を循環します。

 Player PrefabにはプレイヤーのPrefabを,Player Spawn Methodには,StartPositionsコンポーネントをアタッチしたオブジェクトにプレイヤーを

 また,動的に生成されるその他のオブジェクト(敵,弾丸など)のプレハブも登録される必要があります。 ClientScene.RegisterPrefab() 関数で行うことができますが,Registered Spawnable Prefabsに自分で追加することもできます.

 Unity - マニュアル: NetworkBehaviour
 Unity - マニュアル: NetworkManager を使用する

Network Manager HUD

   Network Manager HUDコンポーネントはNetwork Managerと同時に使うことでシンプルなUIを表示します.テスト用に使うべきで,リリース用に使うことは推奨されていません.

 Unity - マニュアル: Network Manager HUD

NetworkIdentity

 公式マニュアルによると,

 NetworkIdentity は、オブジェクトのネットワーク ID を扱い、ネットワークシステムで管理するために使用されます。

とのことです.敵を出現させるWaveや,プレイヤー,敵,弾丸などに使用します.また,

プロパティー: 説明:
serverOnly クライアント上でオブジェクトが生成されないようにするためのフラグ
localPlayerAuthority オブジェクトがクライアントによって制御されている場合は true

 例えば,ServerOnlyは敵を出現させるWaveに,Local Player Authorityはプレイヤーや敵に適用します.

 Unity - マニュアル: NetworkIdentity
 Unity - スクリプトリファレンス: NetworkIdentity

NetworkBehaviour クラス

 名前空間UnityEngine.Networkingを使用することにより,使えるようになります.

NetworkBehaviour は NetworkIdentity コンポーネントを持つオブジェクトとともに機能する、特殊なスクリプトです。

 プレイヤーやプレイヤーの状態(HPなど),敵や敵を生成するWaveのスクリプトに継承させます.

プロパティー: 説明:
isLocalPlayer ローカルのクライアントで使用(操作)されるプレイヤーオブジェクトである場合は true を返します。
isServer オブジェクトがサーバー上で実行されていて、かつ、サーバー上で生成された場合は true を返します。

 Unity - マニュアル: NetworkBehaviour
 Unity - スクリプトリファレンス: NetworkBehaviour

OnStartLocalPlayer()

ローカルプレイヤーのオブジェクトがセットアップされたときに呼び出されます。
(中略)これはカメラや入力装置(input) など、ローカルプレイヤーのみアクティブ化する必要のあるコンポーネントや機能を有効化するために適切な場所です。

 上記のチュートリアルでは,自機の色を青色に変更するために使いました.

Unity - スクリプトリファレンス: Networking.NetworkBehaviour.OnStartLocalPlayer

OnStartServer()

OnStartServer 関数は、サーバー上でオブジェクトが生成されたとき、サーバーにあるシーン内のオブジェクトが起動した(読み込みした)ときに呼び出されます。

 チュートリアルではEnemySpawnerが敵を生成するときに使われました.

Unity - スクリプトリファレンス: Networking.NetworkBehaviour.OnStartServer

NetworkTransform

NetworkTransform コンポーネントはネットワークを介してゲームオブジェクトの移動を同期します。NetworkTransform のインスペクターには NetworkSendRate スライダーがあります。これは作成後、更新を必要としないオブジェクトのためのもので、弾丸などではスライダーを 0 に設定します。

 Unity - マニュアル: NetworkTransform

リモートアクション

[Command]

コマンドはクライアントの操作するプレーヤーオブジェクトから、サーバー上にあるプレーヤーオブジェクトへと送信されるものです。(中略)関数をコマンドに導入するためには、カスタムアトリビュート [Command] を追加し、“Cmd” プレフィックスを加える必要があります。

 要するに,クライアント上で呼ばれサーバ上で実行されるということです.チュートリアルではプレイヤーが弾丸を発射するメソッドで使用されました.

 Unity - マニュアル: リモートアクション

[ClientRpc]

ClientRpc はサーバー上のオブジェクトからクライアントのオブジェクトへと送信されます。(中略)関数を ClientRpc に含めるためには [ClientRpc] カスタムアトリビュートを追加し、“Rpc” プリフィックスを付けてください。

 [Command]とは逆で,サーバ上で呼ばれクライアント上で実行されます.チュートリアルではHealthスクリプト内のプレイヤーをリスポーンさせるメソッド内で使用されました.

NetworkServer クラス

NetworkServer.Spawn

準備できているすべてのクライアントで特定のゲームオブジェクトを生成します。
登録されているプレハブ、または、カスタムの Spawn 関数からインスタンス化される新しいオブジェクトになります。

 チュートリアルでは,弾丸や敵を生成するメソッド内で使用されていました.事前にRegistered Spawnable Prefabsなどで,Prefabを登録しておく必要があります.

Unity - マニュアル: オブジェクトの Spawn(生成)
Unity - スクリプトリファレンス: Networking.NetworkServer.Spawn

ステートの同期

[SyncVar]

SyncVars は、NetworkBehaviour コンポーネントのメンバー変数です。これはサーバーから各クライアントへ同期されます。(中略)利用可能なネットワーク上のオブジェクトの全ての SyncVars の最新の状態が、その新しいオブジェクトやプレイヤーに送られます。

 チュートリアルでは,Healthスクリプト内の現在のHPを格納するフィールド変数に使用されていました.

 Unity - マニュアル: ステートの同期

NetworkStartPosition

NetworkStartPosition は、プレイヤーオブジェクトを作成したときに NetworkManager で使用されます。NetworkStartPosition の位置と角度は、新しくプレイヤーオブジェクトを作成したときの生成場所として使用されます。

 Network Managerで,Spawn InfoのPlayer Spawn MethodをRound RobinにするとNetworkStartPositionをアタッチしたオブジェクトの位置に順番にプレイヤーが生成されるようになります.

 Unity - マニュアル: NetworkStartPosition
 Unity - スクリプトリファレンス: NetworkStartPosition

参考サイト

Unity - Multiplayer Networking
Unity - マニュアル: ネットワーキング リファレンス

Multiplayer Networking/Unity/Standard Assets/Nintendo Switch/Asset Store/Git/GitHub for Windows/Arduino/Blender/はてなブログ/