Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Added

- Added support for serializing `NativeArray<>` and `NativeList<>` in `FastBufferReader`/`FastBufferWriter`, `BufferSerializer`, `NetworkVariable`, and RPCs. (#2375)
- Added support for serializing `NativeArray<>` and `NativeList<>` in `FastBufferReader`/`FastBufferWriter`, `BufferSerializer`, `NetworkVariable`, and RPCs. (To use `NativeList<>`, add `UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT` to your Scripting Define Symbols in `Project Settings > Player`) (#2375)
- The location of the automatically-created default network prefab list can now be configured (#2544)
- Added: Message size limits (max single message and max fragmented message) can now be set using NetworkManager.SetMaxSingleMessageSize() and NetworkManager.SetMaxFragmentedMessageSize() for transports that don't work with the default values (#2530)
- Added `NetworkObject.SpawnWithObservers` property (default is true) that when set to false will spawn a `NetworkObject` with no observers and will not be spawned on any client until `NetworkObject.NetworkShow` is invoked. (#2568)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ private void CreateNetworkVariableTypeInitializers(AssemblyDefinition assembly)
}
equalityMethod.GenericArguments.Add(wrappedType);
}
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
else if (type.Resolve().FullName == "Unity.Collections.NativeList`1")
{
var wrappedType = ((GenericInstanceType)type).GenericArguments[0];
Expand Down Expand Up @@ -247,6 +248,7 @@ private void CreateNetworkVariableTypeInitializers(AssemblyDefinition assembly)
}
equalityMethod.GenericArguments.Add(wrappedType);
}
#endif
else if (type.IsValueType)
{
if (type.HasInterface(typeof(INetworkSerializeByMemcpy).FullName) || type.Resolve().IsEnum || IsMemcpyableType(type))
Expand Down Expand Up @@ -367,21 +369,31 @@ private void CreateNetworkVariableTypeInitializers(AssemblyDefinition assembly)
private TypeReference m_ClientRpcParams_TypeRef;
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedByMemcpy_MethodRef;
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedByMemcpyArray_MethodRef;
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedByMemcpyList_MethodRef;
#endif
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedINetworkSerializable_MethodRef;
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedINetworkSerializableArray_MethodRef;
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedINetworkSerializableList_MethodRef;
#endif
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_ManagedINetworkSerializable_MethodRef;
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_FixedString_MethodRef;
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_FixedStringArray_MethodRef;
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
private MethodReference m_NetworkVariableSerializationTypes_InitializeSerializer_FixedStringList_MethodRef;
#endif
private MethodReference m_NetworkVariableSerializationTypes_InitializeEqualityChecker_ManagedIEquatable_MethodRef;
private MethodReference m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedIEquatable_MethodRef;
private MethodReference m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedIEquatableArray_MethodRef;
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
private MethodReference m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedIEquatableList_MethodRef;
#endif
private MethodReference m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedValueEquals_MethodRef;
private MethodReference m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedValueEqualsArray_MethodRef;
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
private MethodReference m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedValueEqualsList_MethodRef;
#endif
private MethodReference m_NetworkVariableSerializationTypes_InitializeEqualityChecker_ManagedClassEquals_MethodRef;

private MethodReference m_ExceptionCtorMethodReference;
Expand Down Expand Up @@ -836,18 +848,24 @@ private bool ImportReferences(ModuleDefinition moduleDefinition)
case nameof(NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpyArray):
m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedByMemcpyArray_MethodRef = method;
break;

#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
case nameof(NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpyList):
m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedByMemcpyList_MethodRef = method;
break;
#endif
case nameof(NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedINetworkSerializable):
m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedINetworkSerializable_MethodRef = method;
break;
case nameof(NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedINetworkSerializableArray):
m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedINetworkSerializableArray_MethodRef = method;
break;

#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
case nameof(NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedINetworkSerializableList):
m_NetworkVariableSerializationTypes_InitializeSerializer_UnmanagedINetworkSerializableList_MethodRef = method;
break;
#endif
case nameof(NetworkVariableSerializationTypes.InitializeSerializer_ManagedINetworkSerializable):
m_NetworkVariableSerializationTypes_InitializeSerializer_ManagedINetworkSerializable_MethodRef = method;
break;
Expand All @@ -857,9 +875,13 @@ private bool ImportReferences(ModuleDefinition moduleDefinition)
case nameof(NetworkVariableSerializationTypes.InitializeSerializer_FixedStringArray):
m_NetworkVariableSerializationTypes_InitializeSerializer_FixedStringArray_MethodRef = method;
break;

#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
case nameof(NetworkVariableSerializationTypes.InitializeSerializer_FixedStringList):
m_NetworkVariableSerializationTypes_InitializeSerializer_FixedStringList_MethodRef = method;
break;
#endif

case nameof(NetworkVariableSerializationTypes.InitializeEqualityChecker_ManagedIEquatable):
m_NetworkVariableSerializationTypes_InitializeEqualityChecker_ManagedIEquatable_MethodRef = method;
break;
Expand All @@ -869,18 +891,23 @@ private bool ImportReferences(ModuleDefinition moduleDefinition)
case nameof(NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatableArray):
m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedIEquatableArray_MethodRef = method;
break;

#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
case nameof(NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatableList):
m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedIEquatableList_MethodRef = method;
break;
#endif
case nameof(NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedValueEquals):
m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedValueEquals_MethodRef = method;
break;
case nameof(NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedValueEqualsArray):
m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedValueEqualsArray_MethodRef = method;
break;
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
case nameof(NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedValueEqualsList):
m_NetworkVariableSerializationTypes_InitializeEqualityChecker_UnmanagedValueEqualsList_MethodRef = method;
break;
#endif
case nameof(NetworkVariableSerializationTypes.InitializeEqualityChecker_ManagedClassEquals):
m_NetworkVariableSerializationTypes_InitializeEqualityChecker_ManagedClassEquals_MethodRef = method;
break;
Expand Down Expand Up @@ -1366,7 +1393,11 @@ private MethodReference GetFastBufferWriterWriteMethod(string name, TypeReferenc
}
if (method.GenericParameters[0].HasConstraints)
{
if (paramType.IsGenericInstance && (paramType.Resolve().FullName == "Unity.Collections.NativeList`1" || paramType.Resolve().FullName == "Unity.Collections.NativeArray`1"))
if (paramType.IsGenericInstance && (
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
paramType.Resolve().FullName == "Unity.Collections.NativeList`1" ||
#endif
paramType.Resolve().FullName == "Unity.Collections.NativeArray`1"))
{
if (method.Parameters[0].ParameterType.Resolve() != paramType.Resolve())
{
Expand Down Expand Up @@ -1408,7 +1439,11 @@ private MethodReference GetFastBufferWriterWriteMethod(string name, TypeReferenc
{
var instanceMethod = new GenericInstanceMethod(method);

if (paramType.IsGenericInstance && (paramType.Resolve().FullName == "Unity.Collections.NativeList`1" || paramType.Resolve().FullName == "Unity.Collections.NativeArray`1"))
if (paramType.IsGenericInstance && (
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
paramType.Resolve().FullName == "Unity.Collections.NativeList`1" ||
#endif
paramType.Resolve().FullName == "Unity.Collections.NativeArray`1"))
{
var wrappedType = ((GenericInstanceType)paramType).GenericArguments[0];
instanceMethod.GenericArguments.Add(wrappedType);
Expand Down Expand Up @@ -1559,7 +1594,11 @@ private MethodReference GetFastBufferReaderReadMethod(string name, TypeReference
{
continue;
}
if (paramType.IsGenericInstance && (paramType.Resolve().FullName == "Unity.Collections.NativeList`1" || paramType.Resolve().FullName == "Unity.Collections.NativeArray`1"))
if (paramType.IsGenericInstance && (
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
paramType.Resolve().FullName == "Unity.Collections.NativeList`1" ||
#endif
paramType.Resolve().FullName == "Unity.Collections.NativeArray`1"))
{
if (method.Name == "OnSendGlobalCounterClientRpc")
{
Expand Down Expand Up @@ -1616,7 +1655,11 @@ private MethodReference GetFastBufferReaderReadMethod(string name, TypeReference
if (meetsConstraints)
{
var instanceMethod = new GenericInstanceMethod(method);
if (paramType.IsGenericInstance && (paramType.Resolve().FullName == "Unity.Collections.NativeList`1" || paramType.Resolve().FullName == "Unity.Collections.NativeArray`1"))
if (paramType.IsGenericInstance && (
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
paramType.Resolve().FullName == "Unity.Collections.NativeList`1" ||
#endif
paramType.Resolve().FullName == "Unity.Collections.NativeArray`1"))
{
var wrappedType = ((GenericInstanceType)paramType).GenericArguments[0];
instanceMethod.GenericArguments.Add(wrappedType);
Expand Down Expand Up @@ -1691,11 +1734,14 @@ private bool GetReadMethodForParameter(TypeReference paramType, out MethodRefere
}

MethodReference typeMethod;
#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
if (paramType.Resolve().FullName == "Unity.Collections.NativeList`1")
{
typeMethod = GetFastBufferReaderReadMethod(k_ReadValueInPlaceMethodName, paramType);
}
else if (paramType.Resolve().FullName == "Unity.Collections.NativeArray`1")
else
#endif
if (paramType.Resolve().FullName == "Unity.Collections.NativeArray`1")
{
typeMethod = GetFastBufferReaderReadMethod(k_ReadValueTempMethodName, paramType);
}
Expand Down Expand Up @@ -2430,6 +2476,7 @@ private MethodDefinition GenerateStaticHandler(MethodDefinition methodDefinition
processor.Emit(OpCodes.Brfalse, jumpInstruction);
}

#if UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT
if (paramType.IsGenericInstance && paramType.Resolve().FullName == "Unity.Collections.NativeList`1")
{
// var list = NetworkBehaviour.__createNativeList<T>();
Expand All @@ -2449,6 +2496,7 @@ private MethodDefinition GenerateStaticHandler(MethodDefinition methodDefinition
processor.Emit(OpCodes.Call, method);
processor.Emit(OpCodes.Stloc, localIndex);
}
#endif

var foundMethodRef = GetReadMethodForParameter(paramType, out var methodRef);
if (foundMethodRef)
Expand Down
Loading