Пример #1
0
        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);
        }
Пример #2
0
        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);
        }