ネットワーク・アイデンティティ
NetworkIdentity
は、MonoBehaviour
のサブクラスで、SDK のランタイムにネットワーク化されたGameObject
であることを伝えます。このコンポーネントは Networking SDK 内で様々な方法で使用されるので、このコンポーネントが何でどういったことができるのか知ることはとても重要です。このコンポーネントを持っているGameObject
は、全ての接続しているクライアント上で複製されます。
データ
NetworkIdentity
が含んでいる 3 つの値:
値
これは、UInt32
であり、それぞれのNetworkIdentity
インスタンスごとにユニークになっています。しかし、この値は、クライアント上で複製されたインスタンスでは、同じになります。
プレハブ Id
この値はUInt16
です。ネットワークで共有されているGameObject
がプレハブからインスタンス化された時、この値は SDK によってセットされます。4.4. Instantiating a Network Prefab に詳細が記載されています。
オーナー
全ての接続しているクライアントは、ユニークなUInt32
の値で表現されます。この値は、ネットワークオブジェクトをインタンス化する際に、オーナーが指定されていれば設定されます。開発者は、NetworkIdentity
が特定のクライアントによって保持されていないか確認する際に、このフィールドを使用します。
挙動
NetworkIdentity
をGameObject
に追加することで、以下の機能を使うことができるようになります。
クライアントがゲームサーバーに接続された際に、クライアント内の
NetworkIdentity
を持つ全てのGameObject
は、ホストの持つ最新の利用可能な位置と回転値を持った状態でインスタンス化されます。特定の
GameObject
に対してゲームセッション中の全ての接続しているプレイヤーは、同一のNetworkIdentity
を持ちます。
ネットワークオブジェクトとネットワークプレハブ
ネットワークオブジェクトには 2 タイプあります。違いはNetworkIdentity
の値をどのように初期化するかのみです。初期化後は、全く同じように振る舞います。
シーンベースネットワークオブジェクト:最初からシーンに存在するネットワークオブジェクト
インスタンス化されたネットワークオブジェクト:ユーザーによってランタイム中に生成されるネットワークオブジェクト
ネットワークプレハブを作成するには、NetworkIdentity
コンポーネントをプレハブに追加し、RegisterNetworkPrefab
コンポーネントに登録する必要があります。RegisterNetworkPrefab
はMonoBehaviour
のサブクラスで SDK によって提供されます。
これは、各プレハブにユニークな ID を指定するのに使います。
ネットワークプレハブのインスタンス化
ネットワークプレハブを適切にインタンス化するために、NetworkSpawner
クラスのInstantiate
を使う必要があります。NetworkSpawner
はIGameSession
のインスタンスからアクセス可能です。
これらはネットワークプレハブをインスタンス化するための関数シグネチャです。Unity 独自のInstantiate
を使用してネットワークプレハブのインスタンスを生成しても、4.2 で説明したようなレプリケーションの振る舞いは発生しません。
public void Instantiate(NetworkIdentity prefab, Vector3 position, Quaternion rotation, Player owner);
public void Instantiate(NetworkIdentity prefab, Vector3 position, Quaternion rotation, NetworkIdentity parent, Player owner);
public Task<NetworkIdentity> InstantiateAsync(NetworkIdentity prefab, Vector3 position, Quaternion rotation, Player owner, CancellationToken cancellationToken = default);
public Task<NetworkIdentity> InstantiateAsync(NetworkIdentity prefab, Vector3 position, Quaternion rotation, NetworkIdentity parent, Player owner, CancellationToken cancellationToken = default)
IdentityManager
オブジェクトの参照をネットワーク越しに送信することで、受信者がそのオブジェクトに対して何らかのアクションを取りたいと思うことがあると思います。例えば、弾にあたったときに、ヒットしたキャラクターの体力を減らそうとします。
この時、一般的には、NetworkIdentity
のValue
フィールドのUInt32
の値を含んだメッセージを送信します。この値は、受信者側でIdentityManager
クラスを利用して使用されます。つまり、複数のクライアントのやりとりされる全てのオブジェクトは、それにアタッチしているNetworkIdentity
コンポーネントが必要になります。
// Get a NetworkIdentity instance of the specified networkId.
public NetworkIdentity Get(uint networkId);
// Get all NetworkIdentity.
public IEnumerable<NetworkIdentity> GetAll();
// Check whether there is a NetworkIdentity of type networkId.
public bool Contains(uint networkId);