Pass prefabs to ecs with blob array

Hello everyon! I am new on ECS and need some help I think.

I am trying to pass my prefabs to ECS to create new Entities from them when required.

I created some things like these;

I am collecting prefabs and store them in blobarray here;

using Systems.UnitSystem;
using Unity.Collections;
using Unity.Entities;
using UnityEngine;


public struct UnitPrefabRegistry : IComponentData
{
    public BlobAssetReference<Blob> Prefabs;
    public struct Blob
    {
        public struct Entry
        {
            public UnitType Type;
            public Entity Entity;
        }
        
        public BlobArray<Entry> UnitPrefabs;
    }
}



public class UnitPrefabRegistryAuthoring : MonoBehaviour
{
    [System.Serializable]
    public struct UnitPrefabMapping
    {
        public UnitType Type;
        public GameObject Prefab;
    }

    public UnitPrefabMapping[] UnitMappings;

    public class Baker : Baker<UnitPrefabRegistryAuthoring>
    {
        public override void Bake(UnitPrefabRegistryAuthoring authoring)
        {
            var builder = new BlobBuilder(Allocator.Temp);
            ref var root = ref builder.ConstructRoot<UnitPrefabRegistry.Blob>();
            var prefabArray = builder.Allocate(ref root.UnitPrefabs, authoring.UnitMappings.Length);
            
            for (int i = 0; i < authoring.UnitMappings.Length; i++)
            {
                prefabArray[i] = new UnitPrefabRegistry.Blob.Entry()
                {
                    Type = authoring.UnitMappings[i].Type,
                    Entity = GetEntity(authoring.UnitMappings[i].Prefab, TransformUsageFlags.Dynamic)
                };
            }
            
            var blobReference = builder.CreateBlobAssetReference<UnitPrefabRegistry.Blob>(Allocator.Persistent);
            var entity = GetEntity(TransformUsageFlags.None);
            AddBlobAsset(ref blobReference, out var hash);
            AddComponent(entity, new UnitPrefabRegistry
            {
                Prefabs = blobReference,
            });
            
            Debug.Log("BAKED !!!!");
        }
    }
}

and creating new Entitiy from prefabs here

using Systems.UnitSystem;
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using static Unity.Entities.SystemAPI;

[UpdateInGroup(typeof(InitializationSystemGroup))]
public partial struct UnitSpawnSystem : ISystem
{
    public void OnUpdate(ref SystemState state)
    {
        if (!TryGetSingleton(out UnitPrefabRegistry registry))
            return;
        var ecb = GetSingleton<BeginFixedStepSimulationEntityCommandBufferSystem.Singleton>()
            .CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();

        new SpawnJob
        {
            Ecb = ecb,
            Registry = registry,
        }.ScheduleParallel();
    }


    [BurstCompile]
    partial struct SpawnJob : IJobEntity
    {
        public EntityCommandBuffer.ParallelWriter Ecb;
        public UnitPrefabRegistry Registry;

        public void Execute(Entity entity, ref UnitSpawnData spawn, [ChunkIndexInQuery] int sortKey)
        {
            Entity prefab = Entity.Null;
            ref var units = ref Registry.Prefabs.Value.UnitPrefabs;
            for (int i = 0; i < units.Length; i++)
            {
                if (units[i].Type == spawn.UnitType)
                {
                    prefab = units[i].Entity;
                    break;
                }
            }

            for (int i = 0; i < spawn.SpawnCount; i++)
            {
                var instance = Ecb.Instantiate(sortKey, prefab);
                Ecb.SetComponent(sortKey, instance, new LocalTransform
                {
                    Position = spawn.SpawnLocation,
                    Rotation = quaternion.identity,
                    Scale = 1f
                });
            }

            // some old shit
            // float3 offset = spawner.Random.NextFloat3(-spawner.Size, spawner.Size);
            // float3 position = transform.Position + offset;
            // Entity unit = Ecb.Instantiate(spawner.Prefab);
            // Ecb.SetComponent(unit,
            //     new LocalTransform { Position = position, Scale = 1, Rotation = quaternion.identity });
            // Ecb.SetComponent(unit, new AgentBody { Destination = spawner.Destination, IsStopped = false });
            // spawner.Count++;
            Ecb.DestroyEntity(sortKey, entity);
        }
    }
}
using Systems.UnitSystem;
using Unity.Entities;
using Unity.Mathematics;

public struct UnitSpawnData : IComponentData
{
    public UnitType UnitType;
    public int SpawnCount;
    public float3 SpawnLocation;
    public short PlayerId;
    public short WorldId;
}

so, I can see the entity by UnitType correctly. its looking like its working.

BUT I am getting this error;

ArgumentException: System.ArgumentException: srcEntity is not a valid entity
This Exception was thrown from a function compiled with Burst, which has limited exception support.
0x00007ff8eebc171e (Unity) burst_abort
0x00007ff8db80051e (7d85b213aeec672dd3b3fd7b3f7ec14) burst_Abort_Trampoline
0x00007ff8db7085c4 (7d85b213aeec672dd3b3fd7b3f7ec14) Unity.Entities.EntityComponentStore.AssertCanInstantiateEntities (at C:/expoison/extown/Library/PackageCache/com.unity.burst/.Runtime/Library/PackageCache/com.unity.entities/Unity.Entities/EntityComponentStoreDebug.cs:743)
0x00007ff8db709ccc (7d85b213aeec672dd3b3fd7b3f7ec14) Unity.Entities.EntityDataAccess.InstantiateInternalDuringStructuralChange (at C:/expoison/extown/Library/PackageCache/com.unity.burst/.Runtime/Library/PackageCache/com.unity.entities/Unity.Entities/EntityDataAccess.cs:2759)
0x00007ff8db723df5 (7d85b213aeec672dd3b3fd7b3f7ec14) Unity.Entities.EntityCommandBuffer.EcbWalker`1<Unity.Entities.EntityCommandBuffer.PlaybackProcessor>.ProcessChain (at C:/expoison/extown/Library/PackageCache/com.unity.burst/.Runtime/Library/PackageCache/com.unity.entities/Unity.Entities/EntityCommandBuffer.cs:3992)
0x00007ff8db71a05b (7d85b213aeec672dd3b3fd7b3f7ec14) 6cbe9b44f55dff161edecf05c9660a36
0x0000018711941648 (Mono JIT Code) (wrapper managed-to-native) object:wrapper_native_00000189D02E0200 (intptr,int,intptr,int,int)
0x0000018a1b6163c4 (Mono JIT Code) (wrapper delegate-invoke) <Module>:invoke_void_intptr_int_intptr_int_int (intptr,int,intptr,int,int)
0x0000018a1b6161f6 (Mono JIT Code) Unity.Entities.ECBInterop:_forward_mono_ProcessChainChunk (void*,int,Unity.Entities.ECBChainPlaybackState*,int,int) (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ECBInterop.interop.gen.cs:107)
0x0000018a1b615fd3 (Mono JIT Code) Unity.Entities.ECBInterop:ProcessChainChunk (void*,int,Unity.Entities.ECBChainPlaybackState*,int,int) (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ECBInterop.interop.gen.cs:90)
0x0000018a1b6133f3 (Mono JIT Code) Unity.Entities.EntityCommandBuffer/EcbWalker`1<Unity.Entities.EntityCommandBuffer/PlaybackProcessor>:WalkChains (Unity.Entities.EntityCommandBuffer) (at ./Library/PackageCache/com.unity.entities/Unity.Entities/EntityCommandBuffer.cs:3942)
0x0000018a1b61129b (Mono JIT Code) Unity.Entities.EntityCommandBuffer:PlaybackInternal (Unity.Entities.EntityDataAccess*) (at ./Library/PackageCache/com.unity.entities/Unity.Entities/EntityCommandBuffer.cs:3728)
0x0000018a1b60fa43 (Mono JIT Code) Unity.Entities.EntityCommandBuffer:Playback (Unity.Entities.EntityManager) (at ./Library/PackageCache/com.unity.entities/Unity.Entities/EntityCommandBuffer.cs:3668)
0x0000018a187009c3 (Mono JIT Code) Unity.Entities.EntityCommandBufferSystem:FlushPendingBuffers (bool) (at ./Library/PackageCache/com.unity.entities/Unity.Entities/EntityCommandBufferSystem.cs:217)
0x0000018a186fe77b (Mono JIT Code) Unity.Entities.EntityCommandBufferSystem:OnUpdate () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/EntityCommandBufferSystem.cs:182)
0x0000018a186fb7ff (Mono JIT Code) Unity.Entities.SystemBase:Update () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/SystemBase.cs:418)
0x0000018a186fe1d6 (Mono JIT Code) Unity.Entities.ComponentSystemGroup:UpdateAllSystems () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:723)
0x0000018a186fd8bb (Mono JIT Code) Unity.Entities.ComponentSystemGroup:OnUpdate () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:687)
0x0000018a186fb7ff (Mono JIT Code) Unity.Entities.SystemBase:Update () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/SystemBase.cs:418)
0x0000018a186fe1d6 (Mono JIT Code) Unity.Entities.ComponentSystemGroup:UpdateAllSystems () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:723)
0x0000018a186fd83b (Mono JIT Code) Unity.Entities.ComponentSystemGroup:OnUpdate () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:681)
0x0000018a186fb7ff (Mono JIT Code) Unity.Entities.SystemBase:Update () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/SystemBase.cs:418)
0x0000018a186fb0a4 (Mono JIT Code) Unity.Entities.ScriptBehaviourUpdateOrder/DummyDelegateWrapper:TriggerUpdate () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ScriptBehaviourUpdateOrder.cs:523)
0x000001897ba4b728 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this__ (object,intptr,intptr,intptr)
0x00007ff9169f69ce (mono-2.0-bdwgc) mono_jit_runtime_invoke (at C:/build/output/Unity-Technologies/mono/mono/mini/mini-runtime.c:3445)
0x00007ff916938474 (mono-2.0-bdwgc) do_runtime_invoke (at C:/build/output/Unity-Technologies/mono/mono/metadata/object.c:3068)
0x00007ff916938560 (mono-2.0-bdwgc) mono_runtime_invoke (at C:/build/output/Unity-Technologies/mono/mono/metadata/object.c:3115)
0x00007ff8eefbd604 (Unity) scripting_method_invoke
0x00007ff8eef95393 (Unity) ScriptingInvocation::Invoke
0x00007ff8eec0abe6 (Unity) ExecutePlayerLoop
0x00007ff8eec0ac07 (Unity) ExecutePlayerLoop
EntityCommandBuffer was recorded in UnitSpawnSystem and played back in Unity.Entities.BeginFixedStepSimulationEntityCommandBufferSystem.
  at (wrapper managed-to-native) System.Object.wrapper_native_00000189D02E0200(intptr,int,intptr,int,int)
  at (wrapper delegate-invoke) <Module>.invoke_void_intptr_int_intptr_int_int(intptr,int,intptr,int,int)
  at Unity.Entities.ECBInterop._forward_mono_ProcessChainChunk (System.Void* walker, System.Int32 processorType, Unity.Entities.ECBChainPlaybackState* chainStates, System.Int32 currentChain, System.Int32 nextChain) [0x00001] in .\Library\PackageCache\com.unity.entities\Unity.Entities\ECBInterop.interop.gen.cs:107 
  at Unity.Entities.ECBInterop.ProcessChainChunk (System.Void* walker, System.Int32 processorType, Unity.Entities.ECBChainPlaybackState* chainStates, System.Int32 currentChain, System.Int32 nextChain) [0x0000b] in .\Library\PackageCache\com.unity.entities\Unity.Entities\ECBInterop.interop.gen.cs:90 
  at Unity.Entities.EntityCommandBuffer+EcbWalker`1[T].WalkChains (Unity.Entities.EntityCommandBuffer ecb) [0x002d6] in .\Library\PackageCache\com.unity.entities\Unity.Entities\EntityCommandBuffer.cs:3942 
  at Unity.Entities.EntityCommandBuffer.PlaybackInternal (Unity.Entities.EntityDataAccess* mgr) [0x001a5] in .\Library\PackageCache\com.unity.entities\Unity.Entities\EntityCommandBuffer.cs:3728 
  at Unity.Entities.EntityCommandBuffer.Playback (Unity.Entities.EntityManager mgr) [0x00001] in .\Library\PackageCache\com.unity.entities\Unity.Entities\EntityCommandBuffer.cs:3668 
  at Unity.Entities.EntityCommandBufferSystem.FlushPendingBuffers (System.Boolean playBack) [0x000d1] in .\Library\PackageCache\com.unity.entities\Unity.Entities\EntityCommandBufferSystem.cs:217 

Unity.Entities.EntityCommandBufferSystem.FlushPendingBuffers (System.Boolean playBack) (at ./Library/PackageCache/com.unity.entities/Unity.Entities/EntityCommandBufferSystem.cs:280)
Unity.Entities.EntityCommandBufferSystem.OnUpdate () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/EntityCommandBufferSystem.cs:182)
Unity.Entities.SystemBase.Update () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/SystemBase.cs:418)
Unity.Entities.ComponentSystemGroup.UpdateAllSystems () (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:723)
UnityEngine.Debug:LogException(Exception)
Unity.Debug:LogException(Exception) (at ./Library/PackageCache/com.unity.entities/Unity.Entities/Stubs/Unity/Debug.cs:17)
Unity.Entities.ComponentSystemGroup:UpdateAllSystems() (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:728)
Unity.Entities.ComponentSystemGroup:OnUpdate() (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:687)
Unity.Entities.SystemBase:Update() (at ./Library/PackageCache/com.unity.entities/Unity.Entities/SystemBase.cs:418)
Unity.Entities.ComponentSystemGroup:UpdateAllSystems() (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:723)
Unity.Entities.ComponentSystemGroup:OnUpdate() (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ComponentSystemGroup.cs:681)
Unity.Entities.SystemBase:Update() (at ./Library/PackageCache/com.unity.entities/Unity.Entities/SystemBase.cs:418)
Unity.Entities.DummyDelegateWrapper:TriggerUpdate() (at ./Library/PackageCache/com.unity.entities/Unity.Entities/ScriptBehaviourUpdateOrder.cs:523)

but when I passed my prefabs in fields (public Entity unit1, public Entity unit2, public Entity unit3) its working.

I think the problem is related with the BlobArray, is there any alternative for my scenerio?

Entities can’t be stored in blob assets. Blob assets don’t support remapping. Use a DynamicBuffer instead.

thank you! I even tried something with pointers, but I didn’t think of this!