After upgrading from 0.1.1 to 0.3.0-preview.4 and converting my old systems, I’m seeing this error:
Something went wrong while Post Processing the assembly (Engine.dll) :
Sequence contains no matching element
at System.Linq.Enumerable.Single[TSource] (System.Collections.Generic.IEnumerable1[T] source, System.Func2[T,TResult] predicate) [0x00070] in <351e49e2a5bf4fd6beabb458ce2255f3>:0
at Unity.Entities.CodeGen.LambdaJobsPostProcessor.Rewrite (Mono.Cecil.MethodDefinition methodContainingLambdaJob, Unity.Entities.CodeGen.LambdaJobDescriptionConstruction lambdaJobDescriptionConstruction, System.Collections.Generic.List1[T] warnings) [0x00218] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\LambdaJobs\LambdaJobsPostProcessor.cs:297 at Unity.Entities.CodeGen.LambdaJobsPostProcessor.PostProcessImpl () [0x000ad] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\LambdaJobs\LambdaJobsPostProcessor.cs:196 at Unity.Entities.CodeGen.EntitiesILPostProcessor.PostProcess (Mono.Cecil.AssemblyDefinition assemblyDefinition, System.Boolean& madeAChange) [0x00009] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\EntitiesILPostProcessor.cs:209 at Unity.Entities.CodeGen.EntitiesILPostProcessors.Process (Unity.CompilationPipeline.Common.ILPostProcessing.ICompiledAssembly compiledAssembly) [0x0004b] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\EntitiesILPostProcessor.cs:44 at UnityEditor.Scripting.ScriptCompilation.ILPostProcessing.RunILPostProcessors (UnityEditor.Scripting.ScriptCompilation.ScriptAssembly assembly, System.String outputTempPath) [0x0011b] in <3b74787e58694cdda2c241162159b3b7>:0 at UnityEditor.Scripting.ScriptCompilation.ILPostProcessing.PostProcess (UnityEditor.Scripting.ScriptCompilation.ScriptAssembly assembly, System.Collections.Generic.List1[T] messages, System.String outputTempPath) [0x00061] in <3b74787e58694cdda2c241162159b3b7>:0
while using this code:
internal abstract class AbstractRemoveTagJobSystem<TData, TBuffer> : JobComponentSystem
where TData : struct, IComponentData where TBuffer : EntityCommandBufferSystem
{
private TBuffer m_CommandBuffer;
protected override void OnCreate()
{
m_CommandBuffer = World.GetOrCreateSystem<TBuffer>();
}
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
var commandBuffer = m_CommandBuffer.CreateCommandBuffer().ToConcurrent();
inputDeps = Entities
.WithAll<TData>()
.ForEach((Entity entity, int entityInQueryIndex) =>
{
commandBuffer.RemoveComponent<TData>(entityInQueryIndex, entity);
})
.Schedule(inputDeps);
m_CommandBuffer.AddJobHandleForProducer(inputDeps);
return inputDeps;
}
}
If I comment out the WithAll and the RemoveComponent, the compilation exception no longer occurs.
It is the same whether or not the class is used by a concrete implementation.
I’m also seeing a similiar error:
Something went wrong while Post Processing the assembly (Assembly-CSharp.dll) :
Value cannot be null.
Parameter name: key
at System.Collections.Generic.Dictionary2[TKey,TValue].FindEntry (TKey key) [0x00008] in <437ba245d8404784b9fbab9b439ac908>:0 at System.Collections.Generic.Dictionary2[TKey,TValue].TryGetValue (TKey key, TValue& value) [0x00000] in <437ba245d8404784b9fbab9b439ac908>:0
at Unity.Entities.CodeGen.CecilHelpers.CloneClosureExecuteMethodAndItsLocalFunctions (System.Collections.Generic.IEnumerable1[T] methodsToClone, Mono.Cecil.TypeDefinition targetType, System.String newMethodName) [0x003bc] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\CecilHelpers.cs:154 at Unity.Entities.CodeGen.JobStructForLambdaJob.CloneLambdaMethodAndItsLocalMethods () [0x000b7] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\LambdaJobs\EntitiesForEachJobCreator.cs:336 at Unity.Entities.CodeGen.JobStructForLambdaJob..ctor (Unity.Entities.CodeGen.LambdaJobDescriptionConstruction lambdaJobDescriptionConstruction2) [0x00114] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\LambdaJobs\EntitiesForEachJobCreator.cs:117 at Unity.Entities.CodeGen.JobStructForLambdaJob.CreateNewJobStruct (Unity.Entities.CodeGen.LambdaJobDescriptionConstruction lambdaJobDescriptionConstruction) [0x00001] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\LambdaJobs\EntitiesForEachJobCreator.cs:77 at Unity.Entities.CodeGen.LambdaJobsPostProcessor.Rewrite (Mono.Cecil.MethodDefinition methodContainingLambdaJob, Unity.Entities.CodeGen.LambdaJobDescriptionConstruction lambdaJobDescriptionConstruction, System.Collections.Generic.List1[T] warnings) [0x00313] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\LambdaJobs\LambdaJobsPostProcessor.cs:324
at Unity.Entities.CodeGen.LambdaJobsPostProcessor.PostProcessImpl () [0x000ad] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\LambdaJobs\LambdaJobsPostProcessor.cs:196
at Unity.Entities.CodeGen.EntitiesILPostProcessor.PostProcess (Mono.Cecil.AssemblyDefinition assemblyDefinition, System.Boolean& madeAChange) [0x00009] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\EntitiesILPostProcessor.cs:209
at Unity.Entities.CodeGen.EntitiesILPostProcessors.Process (Unity.CompilationPipeline.Common.ILPostProcessing.ICompiledAssembly compiledAssembly) [0x0004b] in E:\ShooterECS\Library\PackageCache\com.unity.entities@0.3.0-preview.4\Unity.Entities.CodeGen\EntitiesILPostProcessor.cs:44
at UnityEditor.Scripting.ScriptCompilation.ILPostProcessing.RunILPostProcessors (UnityEditor.Scripting.ScriptCompilation.ScriptAssembly assembly, System.String outputTempPath) [0x0011b] in <3b74787e58694cdda2c241162159b3b7>:0
at UnityEditor.Scripting.ScriptCompilation.ILPostProcessing.PostProcess (UnityEditor.Scripting.ScriptCompilation.ScriptAssembly assembly, System.Collections.Generic.List`1[T] messages, System.String outputTempPath) [0x00061] in <3b74787e58694cdda2c241162159b3b7>:0
while using this code:
internal class BulletCollisionSystem : JobComponentSystem
{
private EntityCommandBufferSystem m_CommandBufferSystem;
protected override void OnCreate()
{
m_CommandBufferSystem = World.GetOrCreateSystem<EndSimulationEntityCommandBufferSystem>();
}
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
var commandBuffer = m_CommandBufferSystem.CreateCommandBuffer();
Entities
.WithAll<IsBulletTag>()
.ForEach((Entity entity, DynamicBuffer<NewCollisionElementData> collisionBuffer) =>
{
for (int i = 0; i < collisionBuffer.Length; i++)
{
var collisionEntity = collisionBuffer[i].Entity;
if (EntityManager.HasComponent<IsTerrainTag>(collisionEntity))
{
DestroyUtility.MarkForDestroy(entity, commandBuffer);
continue;
}
}
})
.WithoutBurst()
.Run();
return inputDeps;
}
}
The error disappears if DestroyUtility.MarkForDestroy() is removed.
Note that this occurs even if DestroyUtility.MarkForDestroy() is an empty function.
Furthermore (this is fun):
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
var commandBuffer = m_CommandBufferSystem.CreateCommandBuffer();
var terrainCDFE = GetComponentDataFromEntity<IsTerrainTag>(true);
Entities
.WithAll<IsBulletTag>()
.WithReadOnly(terrainCDFE)
.ForEach((Entity entity, DynamicBuffer<NewCollisionElementData> collisionBuffer) =>
{
var array = collisionBuffer.ToNativeArray(Allocator.Temp);
for (int i = 0; i < array.Length; i++)
{
//if (terrainCDFE.Exists(array[i].Entity))
if (EntityManager.HasComponent<IsTerrainTag>(array[i].Entity))
{
//DestroyUtility.MarkForDestroy(entity, commandBuffer);
continue;
}
}
})
.WithoutBurst()
.Run();
return inputDeps;
}
This code compiles, but using terrainCDFE instead of EntityManager causes the same exception as above.
Roycon
December 4, 2019, 7:17pm
4
I get this too, not sure if its 100% the same issue, as mine started when I introduced assembly definitions to my project
My workaround is to go to: Unity.Entities.CodeGen.CecilExtentionsMethods, Line 142 and change it to
var baseTypeRef = arg?.BaseType;
The added null check caused that method to return false and whatever magic was calling it was happy