diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs index 1734d02311..3d56d5136c 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs @@ -963,18 +963,60 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb foreach (var method in type.Methods) { + // to reduce unnecessary type resolution, we first check if it can be a serialization extension without type resolution + if (!method.IsStatic) { continue; } + if (method.Name is not (k_WriteValueMethodName or k_ReadValueMethodName)) + { + continue; + } + + var mayHaveExtensionAttr = false; + + foreach (var attr in method.CustomAttributes) + { + if (attr.Constructor.DeclaringType.FullName == extensionConstructor.DeclaringType.FullName) + { + mayHaveExtensionAttr = true; + break; + } + } + + if (!mayHaveExtensionAttr) + { + continue; + } + + var parameters = method.Parameters; + + if (parameters.Count != 2) + { + continue; + } + + var firstParameterType = parameters[0].ParameterType; + + // ReadValueSafe() and WriteValueSafe() can use both by-ref and non-by-ref type for the first parameter type + var firstParameterElementType = firstParameterType is ByReferenceType byRefType ? byRefType.ElementType : firstParameterType; + + if (firstParameterElementType.FullName != m_FastBufferWriter_TypeRef.FullName && firstParameterElementType.FullName != m_FastBufferReader_TypeRef.FullName) + { + continue; + } + var isExtension = false; foreach (var attr in method.CustomAttributes) { - if (attr.Constructor.Resolve() == extensionConstructor.Resolve()) + if (attr.Constructor.DeclaringType.FullName == extensionConstructor.DeclaringType.FullName && + attr.Constructor.Resolve() == extensionConstructor.Resolve()) { isExtension = true; + break; } } @@ -983,13 +1025,11 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb continue; } - var parameters = method.Parameters; - - if (parameters.Count == 2 && parameters[0].ParameterType.Resolve() == m_FastBufferWriter_TypeRef.MakeByReferenceType().Resolve()) + if (method.Name == k_WriteValueMethodName && firstParameterType.Resolve() == m_FastBufferWriter_TypeRef.MakeByReferenceType().Resolve()) { m_FastBufferWriter_ExtensionMethodRefs.Add(m_MainModule.ImportReference(method)); } - else if (parameters.Count == 2 && parameters[0].ParameterType.Resolve() == m_FastBufferReader_TypeRef.MakeByReferenceType().Resolve()) + else if (method.Name == k_ReadValueMethodName && firstParameterType.Resolve() == m_FastBufferReader_TypeRef.MakeByReferenceType().Resolve()) { m_FastBufferReader_ExtensionMethodRefs.Add(m_MainModule.ImportReference(method)); } @@ -1789,27 +1829,24 @@ private bool GetWriteMethodForParameter(TypeReference paramType, out MethodRefer { var parameters = method.Resolve().Parameters; - if (method.Name == k_WriteValueMethodName) + if (parameters[1].IsIn) { - if (parameters[1].IsIn) + if (((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName && + ((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray) { - if (((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName && - ((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray) - { - methodRef = method; - m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef; - return true; - } + methodRef = method; + m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef; + return true; } - else + } + else + { + if (parameters[1].ParameterType.FullName == paramType.FullName && + parameters[1].ParameterType.IsArray == paramType.IsArray) { - if (parameters[1].ParameterType.FullName == paramType.FullName && - parameters[1].ParameterType.IsArray == paramType.IsArray) - { - methodRef = method; - m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef; - return true; - } + methodRef = method; + m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef; + return true; } } } @@ -2025,8 +2062,7 @@ private bool GetReadMethodForParameter(TypeReference paramType, out MethodRefere foreach (var method in m_FastBufferReader_ExtensionMethodRefs) { var parameters = method.Resolve().Parameters; - if (method.Name == k_ReadValueMethodName && - parameters[1].IsOut && + if (parameters[1].IsOut && ((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName && ((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray) {