public Entity Create(long?uniqueid = null) { var id = uniqueid ?? BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0); var result = _removedAndAvailable.RemoveLast(); if (result == null) { var entityId = _identifierPool.IsEmpty ? _nextAvailableId++ : _identifierPool.RemoveLast(); result = new Entity(_entityWorld, entityId); } else { result.Reset(); } result.UniqueId = id; _uniqueIdToEntities[result.UniqueId] = result; ActiveEntities.Set(result.Id, result); #if DEBUG ++EntitiesRequestedCount; if (TotalCreated < long.MaxValue) { ++TotalCreated; } #endif AddedEntityEvent?.Invoke(result); return(result); }
public void Remove(Entity entity) { Debug.Assert(entity != null, "Entity must not be null."); //Debug.Assert(entity.entityManager == this, ""); // TODO ActiveEntities.Set(entity.Id, null); RemoveComponentsOfEntity(entity); #if DEBUG --EntitiesRequestedCount; if (TotalRemoved < long.MaxValue) { ++TotalRemoved; } #endif if (_removedAndAvailable.Count < RemovedEntitiesRetention) { _removedAndAvailable.Add(entity); } else { _identifierPool.Add(entity.Id); } RemovedEntityEvent?.Invoke(entity); _uniqueIdToEntities.Remove(entity.UniqueId); }