Network Identity
NetworkIdentity is a MonoBehaviour that lets the SDK runtime knows that it’s a networked GameObject. This component is used in many different systems in the Networking SDK so it’s vital to understand what it is and what it’s capable of doing. A GameObject that has this component will be replicated on all connected clients.
Data
NetworkIdentity contains 3 values:
Value
This is a UInt32 that will be unique for every NetworkIdentity instance. However, this value will be the same in the replicated instance on every connected clients. This is the most important data, as it basically acts as the identifier for a particular GameObject within a game session.
Prefab Id
This is a UInt16 value. When a GameObject is instantiated in the network from a prefab, this value will be set by the SDK. More details can be read on section 4.4. Instantiating a Network Prefab
Owner
Every connected client is represented by a unique UInt32 value. This value can be set if the owner is specified when instantiating a Network Object. Developers can use this field to check whether this NetworkIdentity is owned by a particular client.
Behavior
By adding a NetworkIdentity to a GameObject there are some features that developers get automatically:
When a client is connected to a game server, all
GameObjectwith aNetworkIdentitywill be instantiated in that client with the latest available Position and Rotation value from the host.For a particular
GameObject, all connected players within a game session shares the sameNetworkIdentityvalue
Network Objects & Network Prefab
There are two types of Network Objects. The only difference is in how the NetworkIdentity's value is initialized. After this first initialization, both will act exactly the same.
Scene-based Network Objects: Network Objects that exists in Scene originally
Instantiated Network Objects: Network Objects that are created from users in runtime
In order to make a Network Prefab, developers need to add a NetworkIdentity component to a prefab, and registers it to a RegisterNetworkPrefab component. RegisterNetworkPrefab is a MonoBehaviour that is provided by the SDK.

This is required to specify a unique prefab identifier for each prefabs.
Instantiating a Network Prefab
It is important to note that in order to properly instantiate a Network Prefab, we need to use the Instantiate function from the NetworkSpawner class. NetworkSpawner can be accessed from an instance of IGameSession.
These are the function signature for instantiating a Network Prefab. Instantiating a network prefab with Unity’s own Instantiate function will not have the replication behavior explained above.
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
Often developers will want to send a reference of an object over the network so that the receiving end can do some actions on that object. For example when there is a bullet hit, we want to reduce the health of the hit character.
The common pattern here is to send a message containing UInt32 of the NetworkIdentity's Value field. This value can then be consumed on the receiving end by using the IdentityManager class. Note that this means any object that can or may be interacted by multiple clients will need to have a NetworkIdentity component attached to it.
IdenitityManager can be accessed from an instance of IGameSession. There are three important functions that developers need to know about this class.
// 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);