-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Additional documentation and release notes are available at [Multiplayer Documentation](https://docs-multiplayer.unity3d.com). ## [1.0.0-pre.4] - 2021-01-04 ### Added - Added `com.unity.modules.physics` and `com.unity.modules.physics2d` package dependencies (#1565) ### Removed - Removed `com.unity.modules.ai` package dependency (#1565) - Removed `FixedQueue`, `StreamExtensions`, `TypeExtensions` (#1398) ### Fixed - Fixed in-scene NetworkObjects that are moved into the DDOL scene not getting restored to their original active state (enabled/disabled) after a full scene transition (#1354) - Fixed invalid IL code being generated when using `this` instead of `this ref` for the FastBufferReader/FastBufferWriter parameter of an extension method. (#1393) - Fixed an issue where if you are running as a server (not host) the LoadEventCompleted and UnloadEventCompleted events would fire early by the NetworkSceneManager (#1379) - Fixed a runtime error when sending an array of an INetworkSerializable type that's implemented as a struct (#1402) - NetworkConfig will no longer throw an OverflowException in GetConfig() when ForceSamePrefabs is enabled and the number of prefabs causes the config blob size to exceed 1300 bytes. (#1385) - Fixed NetworkVariable not calling NetworkSerialize on INetworkSerializable types (#1383) - Fixed NullReferenceException on ImportReferences call in NetworkBehaviourILPP (#1434) - Fixed NetworkObjects not being despawned before they are destroyed during shutdown for client, host, and server instances. (#1390) - Fixed KeyNotFound exception when removing ownership of a newly spawned NetworkObject that is already owned by the server. (#1500) - Fixed NetworkManager.LocalClient not being set when starting as a host. (#1511) - Fixed a few memory leak cases when shutting down NetworkManager during Incoming Message Queue processing. (#1323) ### Changed - The SDK no longer limits message size to 64k. (The transport may still impose its own limits, but the SDK no longer does.) (#1384) - Updated com.unity.collections to 1.1.0 (#1451)
- Loading branch information
Unity Technologies
committed
Jan 4, 2021
1 parent
f5664b4
commit 36d07fa
Showing
59 changed files
with
1,583 additions
and
679 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
using System; | ||
using System.IO; | ||
using System.Linq; | ||
using System.Collections.Generic; | ||
using System.Reflection; | ||
using Mono.Cecil; | ||
using Mono.Cecil.Cil; | ||
using Mono.Cecil.Rocks; | ||
using Unity.CompilationPipeline.Common.Diagnostics; | ||
using Unity.CompilationPipeline.Common.ILPostProcessing; | ||
using ILPPInterface = Unity.CompilationPipeline.Common.ILPostProcessing.ILPostProcessor; | ||
using MethodAttributes = Mono.Cecil.MethodAttributes; | ||
|
||
namespace Unity.Netcode.Editor.CodeGen | ||
{ | ||
|
||
internal sealed class INetworkSerializableILPP : ILPPInterface | ||
{ | ||
public override ILPPInterface GetInstance() => this; | ||
|
||
public override bool WillProcess(ICompiledAssembly compiledAssembly) => | ||
compiledAssembly.Name == CodeGenHelpers.RuntimeAssemblyName || | ||
compiledAssembly.References.Any(filePath => Path.GetFileNameWithoutExtension(filePath) == CodeGenHelpers.RuntimeAssemblyName); | ||
|
||
private readonly List<DiagnosticMessage> m_Diagnostics = new List<DiagnosticMessage>(); | ||
|
||
public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly) | ||
{ | ||
if (!WillProcess(compiledAssembly)) | ||
{ | ||
return null; | ||
} | ||
|
||
|
||
m_Diagnostics.Clear(); | ||
|
||
// read | ||
var assemblyDefinition = CodeGenHelpers.AssemblyDefinitionFor(compiledAssembly, out var resolver); | ||
if (assemblyDefinition == null) | ||
{ | ||
m_Diagnostics.AddError($"Cannot read assembly definition: {compiledAssembly.Name}"); | ||
return null; | ||
} | ||
|
||
// process | ||
var mainModule = assemblyDefinition.MainModule; | ||
if (mainModule != null) | ||
{ | ||
try | ||
{ | ||
if (ImportReferences(mainModule)) | ||
{ | ||
var types = mainModule.GetTypes() | ||
.Where(t => t.Resolve().HasInterface(CodeGenHelpers.INetworkSerializable_FullName) && !t.Resolve().IsAbstract && t.Resolve().IsValueType) | ||
.ToList(); | ||
// process `INetworkMessage` types | ||
if (types.Count == 0) | ||
{ | ||
return null; | ||
} | ||
|
||
CreateModuleInitializer(assemblyDefinition, types); | ||
} | ||
else | ||
{ | ||
m_Diagnostics.AddError($"Cannot import references into main module: {mainModule.Name}"); | ||
} | ||
} | ||
catch (Exception e) | ||
{ | ||
m_Diagnostics.AddError((e.ToString() + e.StackTrace.ToString()).Replace("\n", "|").Replace("\r", "|")); | ||
} | ||
} | ||
else | ||
{ | ||
m_Diagnostics.AddError($"Cannot get main module from assembly definition: {compiledAssembly.Name}"); | ||
} | ||
|
||
mainModule.RemoveRecursiveReferences(); | ||
|
||
// write | ||
var pe = new MemoryStream(); | ||
var pdb = new MemoryStream(); | ||
|
||
var writerParameters = new WriterParameters | ||
{ | ||
SymbolWriterProvider = new PortablePdbWriterProvider(), | ||
SymbolStream = pdb, | ||
WriteSymbols = true | ||
}; | ||
|
||
assemblyDefinition.Write(pe, writerParameters); | ||
|
||
return new ILPostProcessResult(new InMemoryAssembly(pe.ToArray(), pdb.ToArray()), m_Diagnostics); | ||
} | ||
|
||
private MethodReference m_InitializeDelegates_MethodRef; | ||
|
||
private const string k_InitializeMethodName = nameof(NetworkVariableHelper.InitializeDelegates); | ||
|
||
private bool ImportReferences(ModuleDefinition moduleDefinition) | ||
{ | ||
|
||
var helperType = typeof(NetworkVariableHelper); | ||
foreach (var methodInfo in helperType.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public)) | ||
{ | ||
switch (methodInfo.Name) | ||
{ | ||
case k_InitializeMethodName: | ||
m_InitializeDelegates_MethodRef = moduleDefinition.ImportReference(methodInfo); | ||
break; | ||
} | ||
} | ||
return true; | ||
} | ||
|
||
private MethodDefinition GetOrCreateStaticConstructor(TypeDefinition typeDefinition) | ||
{ | ||
var staticCtorMethodDef = typeDefinition.GetStaticConstructor(); | ||
if (staticCtorMethodDef == null) | ||
{ | ||
staticCtorMethodDef = new MethodDefinition( | ||
".cctor", // Static Constructor (constant-constructor) | ||
MethodAttributes.HideBySig | | ||
MethodAttributes.SpecialName | | ||
MethodAttributes.RTSpecialName | | ||
MethodAttributes.Static, | ||
typeDefinition.Module.TypeSystem.Void); | ||
staticCtorMethodDef.Body.Instructions.Add(Instruction.Create(OpCodes.Ret)); | ||
typeDefinition.Methods.Add(staticCtorMethodDef); | ||
} | ||
|
||
return staticCtorMethodDef; | ||
} | ||
|
||
// Creates a static module constructor (which is executed when the module is loaded) that registers all the | ||
// message types in the assembly with MessagingSystem. | ||
// This is the same behavior as annotating a static method with [ModuleInitializer] in standardized | ||
// C# (that attribute doesn't exist in Unity, but the static module constructor still works) | ||
// https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.moduleinitializerattribute?view=net-5.0 | ||
// https://web.archive.org/web/20100212140402/http://blogs.msdn.com/junfeng/archive/2005/11/19/494914.aspx | ||
private void CreateModuleInitializer(AssemblyDefinition assembly, List<TypeDefinition> networkSerializableTypes) | ||
{ | ||
foreach (var typeDefinition in assembly.MainModule.Types) | ||
{ | ||
if (typeDefinition.FullName == "<Module>") | ||
{ | ||
var staticCtorMethodDef = GetOrCreateStaticConstructor(typeDefinition); | ||
|
||
var processor = staticCtorMethodDef.Body.GetILProcessor(); | ||
|
||
var instructions = new List<Instruction>(); | ||
|
||
foreach (var type in networkSerializableTypes) | ||
{ | ||
var method = new GenericInstanceMethod(m_InitializeDelegates_MethodRef); | ||
method.GenericArguments.Add(type); | ||
instructions.Add(processor.Create(OpCodes.Call, method)); | ||
} | ||
|
||
instructions.ForEach(instruction => processor.Body.Instructions.Insert(processor.Body.Instructions.Count - 1, instruction)); | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.