Skip to main content

Arrays

Arrays of C# primitive types, like int[], and Unity primitive types, such as Vector3, are serialized by built-in serialization code. Otherwise, any array of types that aren't handled by the built-in serialization code, such as string[], needs to be handled through a container class or structure that implements the INetworkSerializable interface.

Built-In Primitive Types Example

Using built-in primitive types is fairly straight forward:

[ServerRpc]
void HelloServerRpc(int[] scores, Color[] colors) { /* ... */ }

INetworkSerializable Implementation Example

There are many ways to handle sending an array of managed types. The below example is a simple string container class that implements INetworkSerializable and can be used as an array of "StringContainers":

[ClientRpc]
void SendMessagesClientRpc(StringContainer[] messages)
{
foreach (var stringContainer in stringContainers)
{
Debug.Log($"{stringContainer.SomeText}");
}
}

public class StringContainer : INetworkSerializable
{
public string SomeText;
public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
{
if (serializer.IsWriter)
{
serializer.GetFastBufferWriter().WriteValueSafe(SomeText);
}
else
{
serializer.GetFastBufferReader().ReadValueSafe(out SomeText);
}
}
}

Native Containers

Native containers, like NativeArray, aren't natively supported as RPC parameters. However, custom support can be added for them; see Custom Serialization