private void OnDestroyEntity(IEntity entity) { var tEntity = (TEntity)entity; var removed = _entities.Remove(tEntity); if (!removed) { throw new ContextDoesNotContainEntityException( "'" + this + "' cannot destroy " + tEntity + "!", "This cannot happen!?!"); } _entitiesCache = null; OnEntityWillBeDestroyed?.Invoke(this, tEntity); tEntity.InternalDestroy(); OnEntityDestroyed?.Invoke(this, tEntity); if (tEntity.RetainCount == 1) { // Can be released immediately without // adding to _retainedEntities tEntity.OnEntityReleased -= _cachedEntityReleased; _reusableEntities.Push(tEntity); tEntity.Release(this); tEntity.RemoveAllOnEntityReleasedHandlers(); } else { _retainedEntities.Add(tEntity); tEntity.Release(this); } }
/// Destroys the entity, removes all its components and pushs it back to the internal ObjectPool for entities. public virtual void DestroyEntity(Entity <T> entity) { var removed = _entities.Remove(entity); if (!removed) { throw new PoolDoesNotContainEntityException <T>("'" + this + "' cannot destroy " + entity + "!", "Did you call pool.DestroyEntity() on a wrong pool?"); } _entitiesCache = null; OnEntityWillBeDestroyed?.Invoke(this, entity); entity.Destroy(); OnEntityDestroyed?.Invoke(this, entity); if (entity.owners.Count == 1) { // Can be released immediately without going to _retainedEntities entity.OnEntityReleased -= _cachedOnEntityReleased; _reusableEntities.Push(entity); entity.Release(this); entity.RemoveAllOnEntityReleasedHandlers(); } else { _retainedEntities.Add(entity); entity.Release(this); } }