public Entity[] CreateEntities(int numEntities, EntityArchetype archetype = null)
        {
            DebugHelper.AssertThrow <ThreadAccessException>(ECSWorld.CheckThreadIsMainThread());
            world.SyncPoint();
            if (archetype == null)
            {
                archetype = EntityArchetype.Empty;
            }
            Entity[] arr = new Entity[numEntities];

            for (int i = 0; i < arr.Length; i++)
            {
                if (freeEntities.TryPop(out Entity result))
                {
                    result = new Entity(result.id, result.version + 1);
                    componentManager.AddEntity(result, archetype);
                    arr[i] = result;
                    new EntityCreatedEvent(result).Fire(world);
                }
                else
                {
                    Entity e = new Entity(NextIndex(), 0);
                    componentManager.AddEntity(e, archetype);
                    arr[i] = e;
                    new EntityCreatedEvent(e).Fire(world);
                }
            }

            return(arr);
        }
Пример #2
0
        public void Playback()
        {
            DebugHelper.AssertThrow <ThreadAccessException>(ECSWorld.CheckThreadIsMainThread());
            if (!IsEmpty())
            {
                Jobs.CompleteAllJobs();
                int i = 0;
                while (i < modList.Length)
                {
                    IModification?mod = modList[i++];
                    if (mod == null)
                    {
                        break;
                    }

                    try {
                        mod.Execute(this);
                    }
                    catch (InvalidEntityException _) { }
                    catch (ComponentNotFoundException _) { }
                }

                pool.Return(modList);
                modList         = Array.Empty <IModification?>();
                entityTarget    = default;
                hasEntityTarget = false;
                nextIndex       = 0;
            }
        }
Пример #3
0
 public void Playback()
 {
     DebugHelper.AssertThrow <ThreadAccessException>(ECSWorld.CheckThreadIsMainThread());
     if (threadBuffersCache == null)
     {
         threadBuffersCache = threadBuffers.Values as List <EntityCommandBuffer>;
     }
     world.SyncPoint();
     foreach (EntityCommandBuffer buffer in threadBuffersCache)
     {
         buffer.Playback();
     }
 }
 public bool TryGetComponentData <T>(out Span <T> data) where T : unmanaged, IComponent
 {
     DebugHelper.AssertThrow <ThreadAccessException>(ECSWorld.CheckThreadIsMainThread());
     Jobs.CompleteAllJobs();
     if (block.archetype.Has <T>())
     {
         block.IncrementComponentVersion(TypeHelper <T> .hashCode);
         data = block.GetComponentData <T>().Slice(0, block.Size);
         return(true);
     }
     else
     {
         data = Span <T> .Empty;
         return(false);
     }
 }
Пример #5
0
        public bool IsEmpty()
        {
            DebugHelper.AssertThrow <ThreadAccessException>(ECSWorld.CheckThreadIsMainThread());
            Jobs.CompleteAllJobs();
            if (threadBuffersCache == null)
            {
                threadBuffersCache = threadBuffers.Values as List <EntityCommandBuffer>;
            }
            foreach (EntityCommandBuffer buffer in threadBuffersCache)
            {
                if (!buffer.IsEmpty())
                {
                    return(false);
                }
            }

            return(true);
        }
 public Entity CreateEntity(EntityArchetype archetype = null)
 {
     DebugHelper.AssertThrow <ThreadAccessException>(ECSWorld.CheckThreadIsMainThread());
     world.SyncPoint();
     if (archetype == null)
     {
         archetype = EntityArchetype.Empty;
     }
     if (freeEntities.TryPop(out Entity result))
     {
         result = new Entity(result.id, result.version + 1);
         componentManager.AddEntity(result, archetype);
         new EntityCreatedEvent(result).Fire(world);
         return(result);
     }
     else
     {
         Entity e = new Entity(NextIndex(), 0);
         componentManager.AddEntity(e, archetype);
         new EntityCreatedEvent(e).Fire(world);
         return(e);
     }
 }