private void RemoveEntity([NotNull] IEntityHandle ent) { if (ent == null) { throw new ArgumentNullException(nameof(ent)); } Debug.Assert(SyncEntities.Contains(ent)); Debug.Assert(!InitEntities.Contains(ent)); LeaveEntities.Add(ent); }
protected IEnumerable <IUpdateSegment> GetSyncSegments( [NotNull] IList <IUpdateWriter> updateSegments, [NotNull] Func <FlagAccumulatorComponent, IUpdateWriter> updateWriterFactory) { if (updateSegments == null) { throw new ArgumentNullException(nameof(updateSegments)); } if (updateWriterFactory == null) { throw new ArgumentNullException(nameof(updateWriterFactory)); } var removeList = new List <IEntityHandle>(); var syncSegments = new List <IUpdateSegment>(); foreach (var handle in SyncEntities) { // remove entity if // it's dead // or its in the leave list if (handle.IsDead() || LeaveEntities.Contains(handle)) { syncSegments.Add(RemoveEntitySegment.Instance); removeList.Add(handle); } else { var entity = handle.Get(); var flags = entity.Components.AssertGet <FlagAccumulatorComponent>(); if (flags.Reinitialize) { InitEntities.Add(handle); removeList.Add(handle); } else { var updater = updateWriterFactory(flags); var needsUpdate = updater.NeedsUpdate(); syncSegments.Add(CommonSegmentResolve(flags, needsUpdate)); if (needsUpdate) { updateSegments.Add(updater); } } } } // cleanup LeaveEntities.Clear(); foreach (var handle in removeList) { SyncEntities.Remove(handle); } return(syncSegments); }