Note: UNet is deprecated, and will be removed from Unity in the future. A new system is under development. For more information and next steps see this blog post. |
サーバーとクライアントは、いずれもゲームオブジェクトの動作を管理することができます。「権限」の概念はどのように、どこでゲームオブジェクトが管理されるかを意味します。
HLAPI を使用してネットワーク化された Unity のゲームのデフォルト状態では、サーバーがプレイヤー以外のすべてのゲームオブジェクトに対し権限を持っています。つまり、例えば、サーバーはすべての収集可能なアイテム、移動する台、NPC (ノンプレイヤーキャラクター) 、プレイヤーが相互作用できるその他の部分すべてを管理します。一方、プレイヤーゲームオブジェクトはその所有者のクライアント上で権限を持ちます (つまり、クライアントがプレイヤーゲームオブジェクトの動作を管理します)。
ローカル権限 (クライアント権限とも呼ばれます) は、ネットワーク化された特定のゲームオブジェクトを制御する権限をローカルクライアントが持つことを意味します。これは、ネットワーク化されたゲームオブジェクトの制御権限をサーバーが持つデフォルトの状態とは対照的です。
isLocalPlayer
に加えて、プレイヤーゲームオブジェクトに「ローカル権限」を持たせることもできます。つまり、所有者のクライアント上のプレイヤーゲームオブジェクトが自身に対する権限を持つことを意味します。これは特に動きを制御するのに便利です。なぜなら、各クライアントがそのプレイヤーゲームオブジェクトをどのように制御するかについて権限を持つからです。
ゲームオブジェクトでローカルプレイヤー権限を有効にするには、Network Identity コンポーネントの Local Player Authority チェックボックスにチェックを入れます。Network Transform コンポーネントはこの「権限」設定を利用し、クライアントから他のクライアントへの動きの情報を送信します。
スクリプトを使用してローカルプレイヤー権限を実装する方法については、スクリプトリファレンスの NetworkIdentity と localPlayerAuthority を参照してください。
ゲームオブジェクトがローカル権限を持っているかを確認するには、NetworkIdentity.hasAuthority プロパティを使用します ( NetworkBehaviour
でもアクセス可能です)。 ノンプレイヤーゲームオブジェクトに関してはサーバーが権限を持ち、**localPlayerAuthority ** が設定されたプレイヤーゲームオブジェクトに関してはそれを所有するクライアントが権限を持ちます。
ノンプレイヤーゲームオブジェクトに対するクライアント権限を設定することが可能です。これを行うには 2 つの方法があります。1 つは NetworkServer.SpawnWithClientAuthority を使用してゲームオブジェクトをスポーンし、所有権を取得するためにクライアントのネットワーク接続を渡すことです。もう 1 つは、クライアントのネットワーク接続をパラメーターにして NetworkIdentity.AssignClientAuthority を使用して、所有権を取得する方法です。
権限をクライアントに与えると、Unity はゲームオブジェクトの各 NetworkBehaviour
の OnStartAuthority() を呼び出し、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 スクリプトコンポーネントのプレビューウィンドウを見ます。これらのプロパティの値を使用して、スクリプトが実行されているコンテキストに基づいてコードを実行することができます。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.