/// <summary> /// EntityManager.BeforeStructuralChange must be called before invoking this. /// ManagedComponentStore.Playback must be called after invoking this. /// EntityQueryManager.AddAdditionalArchetypes must be called after invoking this. /// Invoking this must be wrapped in ArchetypeChangeTracking. /// </summary> /// <param name="archetypeList"></param> /// <param name="filter"></param> /// <param name="componentType"></param> /// <exception cref="InvalidOperationException"></exception> public void RemoveComponentDuringStructuralChange(UnsafeMatchingArchetypePtrList archetypeList, EntityQueryFilter filter, ComponentType componentType) { if (!m_IsMainThread) { throw new InvalidOperationException("Must be called from the main thread"); } using (var chunks = ChunkIterationUtility.CreateArchetypeChunkArray(archetypeList, Allocator.TempJob, ref filter, DependencyManager)) { StructuralChange.RemoveComponentChunks(EntityComponentStore, (ArchetypeChunk *)NativeArrayUnsafeUtility.GetUnsafePtr(chunks), chunks.Length, componentType.TypeIndex); } }
internal void RemoveComponent(NativeArray <ArchetypeChunk> chunks, ComponentType componentType) { if (m_IsMainThread) { BeforeStructuralChange(); } var archetypeChanges = EntityComponentStore->BeginArchetypeChangeTracking(); StructuralChange.RemoveComponentChunks(EntityComponentStore, (ArchetypeChunk *)NativeArrayUnsafeUtility.GetUnsafePtr(chunks), chunks.Length, componentType.TypeIndex); EntityComponentStore->EndArchetypeChangeTracking(archetypeChanges, EntityQueryManager); PlaybackManagedChanges(); }
internal void RemoveComponent(NativeArray <ArchetypeChunk> chunks, ComponentType componentType) { if (chunks.Length == 0) { return; } EntityComponentStore->AssertCanRemoveComponent(chunks, componentType); if (m_IsMainThread) { EntityManager.BeforeStructuralChange(); } var archetypeChanges = EntityComponentStore->BeginArchetypeChangeTracking(); StructuralChange.RemoveComponentChunks(EntityComponentStore, (ArchetypeChunk *)NativeArrayUnsafeUtility.GetUnsafePtr(chunks), chunks.Length, componentType.TypeIndex); var changedArchetypes = EntityComponentStore->EndArchetypeChangeTracking(archetypeChanges); EntityQueryManager.AddAdditionalArchetypes(changedArchetypes); ManagedComponentStore.Playback(ref EntityComponentStore->ManagedChangesTracker); }