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?