Version: 2019.3
言語: 日本語
カスタムのスポーン関数
状態同期

ネットワーク権限

ノート: UNet は非推奨となり、今後 Unity から削除される予定です。新しいシステムが開発中です。詳細は ブログFAQ を参照してください。

サーバーとクライアントは、いずれもゲームオブジェクトの動作を管理することができます。「権限」の概念はどのように、どこでゲームオブジェクトが管理されるかを意味します。

サーバー権限

HLAPI を使用してネットワーク化された Unity のゲームのデフォルト状態では、サーバーがプレイヤー以外のすべてのゲームオブジェクトに対し権限を持っています。つまり、例えば、サーバーはすべての収集可能なアイテム、移動する台、NPC (ノンプレイヤーキャラクター) 、プレイヤーが相互作用できるその他の部分すべてを管理します。一方、プレイヤーゲームオブジェクトはその所有者のクライアント上で権限を持ちます (つまり、クライアントがプレイヤーゲームオブジェクトの動作を管理します)。

ローカル権限

ローカル権限 (クライアント権限とも呼ばれます) は、ネットワーク化された特定のゲームオブジェクトを制御する権限をローカルクライアントが持つことを意味します。これは、ネットワーク化されたゲームオブジェクトの制御権限をサーバーが持つデフォルトの状態とは対照的です。

isLocalPlayer に加えて、プレイヤーゲームオブジェクトに「ローカル権限」を持たせることもできます。つまり、所有者のクライアント上のプレイヤーゲームオブジェクトが自身に対する権限を持つことを意味します。これは特に動きを制御するのに便利です。なぜなら、各クライアントがそのプレイヤーゲームオブジェクトをどのように制御するかについて権限を持つからです。

ゲームオブジェクトでローカルプレイヤー権限を有効にするには、Network Identity コンポーネントの Local Player Authority チェックボックスにチェックを入れます。Network Transform コンポーネントはこの「権限」設定を利用し、クライアントから他のクライアントへの動きの情報を送信します。

スクリプトを使用してローカルプレイヤー権限を実装する方法については、スクリプトリファレンスの NetworkIdentitylocalPlayerAuthority を参照してください。

この図は、サーバー権限での Enemy (敵) オブジェクトを示しています。Enemy は Client 1 と Client 2 に現れますが、その位置、移動、動作を管理するのはサーバーです。
この図は、サーバー権限での Enemy (敵) オブジェクトを示しています。Enemy は Client 1 と Client 2 に現れますが、その位置、移動、動作を管理するのはサーバーです。

ゲームオブジェクトがローカル権限を持っているかを確認するには、NetworkIdentity.hasAuthority プロパティーを使用します ( NetworkBehaviour でもアクセス可能です)。 ノンプレイヤーゲームオブジェクトに関してはサーバーが権限を持ち、**localPlayerAuthority ** が設定されたプレイヤーゲームオブジェクトに関してはそれを所有するクライアントが権限を持ちます。

ノンプレイヤーゲームオブジェクトのローカル (クライアント) 権限

ノンプレイヤーゲームオブジェクトに対するクライアント権限を設定することが可能です。これを行うには 2 つの方法があります。1 つは NetworkServer.SpawnWithClientAuthority を使用してゲームオブジェクトをスポーンし、所有権を取得するためにクライアントのネットワーク接続を渡すことです。もう 1 つは、クライアントのネットワーク接続をパラメーターにして NetworkIdentity.AssignClientAuthority を使用して、所有権を取得する方法です。

権限をクライアントに与えると、Unity はゲームオブジェクトの各 NetworkBehaviourOnStartAuthority() を呼び出し、hasAuthority プロパティーを true に設定します。他のクライアントでは、hasAuthority プロパティーは false のままにします。クライアント権限を持つノンプレイヤーゲームオブジェクトは、プレイヤー同様に コマンド を送信できます。これらの コマンド は、接続に関係づけられたプレイヤーではなく、ゲームオブジェクトのサーバーインスタンスで実行されます。

ノンプレイヤーゲームオブジェクトにクライアント権限を設定したい場合は、Network Identity コンポーネントで localPlayerAuthority を有効にする必要があります。下の例では、ゲームオブジェクトをスポーンして、それを行ったプレイヤーのクライアントに権限を割り当てます。

[Command]
void CmdSpawn()
{
    var go = (GameObject)Instantiate(otherPrefab, transform.position + new Vector3(0,1,0), Quaternion.identity);
    NetworkServer.SpawnWithClientAuthority(go, connectionToClient);
}

ネットワークコンテキストに関するプロパティー

NetworkBehaviour クラスには、ネットワーク化されたゲームオブジェクトのコンテキストの情報をスクリプが把握できるようなプロパティーが備えられています。

  • isServer - ゲームオブジェクトがサーバー (または、ホスト) にあり、すでにスポーンされている場合は true

  • isClient - ゲームオブジェクトがクライアントにあり、サーバーによって作成された場合は true

  • isLocalPlayer - ゲームオブジェクトがクライアントのプレイヤーゲームオブジェクトである場合は true

  • hasAuthority - ゲームオブジェクトがローカルの処理によって所有される場合は true

これらのプロパティーを確認するには、検証したいゲームオブジェクトを選択し、インスペクターウィンドウの NetworkBehaviour スクリプトコンポーネントのプレビューウィンドウを見ます。これらのプロパティーの値を使用して、スクリプトが実行されているコンテキストに基づいてコードを実行することができます。

カスタムのスポーン関数
状態同期