using System; using UnityEngine; namespace Unity.Netcode { public class NetworkVariableHelper { // This is called by ILPP during module initialization for all unmanaged INetworkSerializable types // This sets up NetworkVariable so that it properly calls NetworkSerialize() when wrapping an INetworkSerializable value // // The reason this is done is to avoid runtime reflection and boxing in NetworkVariable - without this, // NetworkVariable would need to do a `var is INetworkSerializable` check, and then cast to INetworkSerializable, // *both* of which would cause a boxing allocation. Alternatively, NetworkVariable could have been split into // NetworkVariable and NetworkSerializableVariable or something like that, which would have caused a poor // user experience and an API that's easier to get wrong than right. This is a bit ugly on the implementation // side, but it gets the best achievable user experience and performance. // // RuntimeAccessModifiersILPP will make this `public` internal static void InitializeDelegatesNetworkSerializable() where T : unmanaged, INetworkSerializable { NetworkVariableSerialization.SetWriteDelegate(NetworkVariableSerialization.WriteNetworkSerializable); NetworkVariableSerialization.SetReadDelegate(NetworkVariableSerialization.ReadNetworkSerializable); } internal static void InitializeDelegatesStruct() where T : unmanaged, INetworkSerializeByMemcpy { NetworkVariableSerialization.SetWriteDelegate(NetworkVariableSerialization.WriteStruct); NetworkVariableSerialization.SetReadDelegate(NetworkVariableSerialization.ReadStruct); } internal static void InitializeDelegatesEnum() where T : unmanaged, Enum { NetworkVariableSerialization.SetWriteDelegate(NetworkVariableSerialization.WriteEnum); NetworkVariableSerialization.SetReadDelegate(NetworkVariableSerialization.ReadEnum); } internal static void InitializeDelegatesPrimitive() where T : unmanaged, IComparable, IConvertible, IComparable, IEquatable { NetworkVariableSerialization.SetWriteDelegate(NetworkVariableSerialization.WritePrimitive); NetworkVariableSerialization.SetReadDelegate(NetworkVariableSerialization.ReadPrimitive); } internal static void InitializeAllBaseDelegates() { // Built-in C# types, serialized through a generic method InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); InitializeDelegatesPrimitive(); // Built-in Unity types, serialized with specific overloads because they're structs without ISerializeByMemcpy attached NetworkVariableSerialization.SetWriteDelegate((FastBufferWriter writer, in Vector2 value) => { writer.WriteValueSafe(value); }); NetworkVariableSerialization.SetWriteDelegate((FastBufferWriter writer, in Vector3 value) => { writer.WriteValueSafe(value); }); NetworkVariableSerialization.SetWriteDelegate((FastBufferWriter writer, in Vector4 value) => { writer.WriteValueSafe(value); }); NetworkVariableSerialization.SetWriteDelegate((FastBufferWriter writer, in Quaternion value) => { writer.WriteValueSafe(value); }); NetworkVariableSerialization.SetWriteDelegate((FastBufferWriter writer, in Color value) => { writer.WriteValueSafe(value); }); NetworkVariableSerialization.SetWriteDelegate((FastBufferWriter writer, in Color32 value) => { writer.WriteValueSafe(value); }); NetworkVariableSerialization.SetWriteDelegate((FastBufferWriter writer, in Ray value) => { writer.WriteValueSafe(value); }); NetworkVariableSerialization.SetWriteDelegate((FastBufferWriter writer, in Ray2D value) => { writer.WriteValueSafe(value); }); NetworkVariableSerialization.SetReadDelegate((FastBufferReader reader, out Vector2 value) => { reader.ReadValueSafe(out value); }); NetworkVariableSerialization.SetReadDelegate((FastBufferReader reader, out Vector3 value) => { reader.ReadValueSafe(out value); }); NetworkVariableSerialization.SetReadDelegate((FastBufferReader reader, out Vector4 value) => { reader.ReadValueSafe(out value); }); NetworkVariableSerialization.SetReadDelegate((FastBufferReader reader, out Quaternion value) => { reader.ReadValueSafe(out value); }); NetworkVariableSerialization.SetReadDelegate((FastBufferReader reader, out Color value) => { reader.ReadValueSafe(out value); }); NetworkVariableSerialization.SetReadDelegate((FastBufferReader reader, out Color32 value) => { reader.ReadValueSafe(out value); }); NetworkVariableSerialization.SetReadDelegate((FastBufferReader reader, out Ray value) => { reader.ReadValueSafe(out value); }); NetworkVariableSerialization.SetReadDelegate((FastBufferReader reader, out Ray2D value) => { reader.ReadValueSafe(out value); }); } } }