メインコンテンツまでスキップ

ネットワーク・アイデンティティ

NetworkIdentityは、MonoBehaviourのサブクラスで、SDK のランタイムにネットワーク化されたGameObjectであることを伝えます。このコンポーネントは Networking SDK 内で様々な方法で使用されるので、このコンポーネントが何でどういったことができるのか知ることはとても重要です。このコンポーネントを持っているGameObjectは、全ての接続しているクライアント上で複製されます。

データ

NetworkIdentity が含んでいる 3 つの値:

これは、UInt32であり、それぞれのNetworkIdentityインスタンスごとにユニークになっています。しかし、この値は、クライアント上で複製されたインスタンスでは、同じになります。

プレハブ Id

この値はUInt16です。ネットワークで共有されているGameObjectがプレハブからインスタンス化された時、この値は SDK によってセットされます。4.4. Instantiating a Network Prefab に詳細が記載されています。

オーナー

全ての接続しているクライアントは、ユニークなUInt32の値で表現されます。この値は、ネットワークオブジェクトをインタンス化する際に、オーナーが指定されていれば設定されます。開発者は、NetworkIdentityが特定のクライアントによって保持されていないか確認する際に、このフィールドを使用します。

挙動

NetworkIdentityGameObjectに追加することで、以下の機能を使うことができるようになります。

  1. クライアントがゲームサーバーに接続された際に、クライアント内のNetworkIdentityを持つ全てのGameObjectは、ホストの持つ最新の利用可能な位置と回転値を持った状態でインスタンス化されます。

  2. 特定のGameObjectに対してゲームセッション中の全ての接続しているプレイヤーは、同一のNetworkIdentityを持ちます。

ネットワークオブジェクトとネットワークプレハブ

ネットワークオブジェクトには 2 タイプあります。違いはNetworkIdentityの値をどのように初期化するかのみです。初期化後は、全く同じように振る舞います。

  1. シーンベースネットワークオブジェクト:最初からシーンに存在するネットワークオブジェクト

  2. インスタンス化されたネットワークオブジェクト:ユーザーによってランタイム中に生成されるネットワークオブジェクト

ネットワークプレハブを作成するには、NetworkIdentityコンポーネントをプレハブに追加し、RegisterNetworkPrefabコンポーネントに登録する必要があります。RegisterNetworkPrefabMonoBehaviourのサブクラスで SDK によって提供されます。

これは、各プレハブにユニークな ID を指定するのに使います。

ネットワークプレハブのインスタンス化

ネットワークプレハブを適切にインタンス化するために、NetworkSpawnerクラスのInstantiateを使う必要があります。NetworkSpawnerIGameSessionのインスタンスからアクセス可能です。

これらはネットワークプレハブをインスタンス化するための関数シグネチャです。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

オブジェクトの参照をネットワーク越しに送信することで、受信者がそのオブジェクトに対して何らかのアクションを取りたいと思うことがあると思います。例えば、弾にあたったときに、ヒットしたキャラクターの体力を減らそうとします。

この時、一般的には、NetworkIdentityValueフィールドの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);