private void CheckEntityComponentWithProcessors(Entity entity, EntityComponent component, bool forceRemove, List <EntityProcessor> dependentProcessors) { var componentType = component.GetType().GetTypeInfo(); EntityProcessorCollectionPerComponentType processorsForComponent; if (MapComponentTypeToProcessors.TryGetValue(componentType, out processorsForComponent)) { for (int i = 0; i < processorsForComponent.Count; i++) { processorsForComponent[i].ProcessEntityComponent(entity, component, forceRemove); } } else { processorsForComponent = new EntityProcessorCollectionPerComponentType(); for (int j = 0; j < processors.Count; j++) { var processor = processors[j]; if (processor.Accept(componentType)) { processorsForComponent.Add(processor); processor.ProcessEntityComponent(entity, component, forceRemove); } if (processor.IsDependentOnComponentType(componentType)) { if (processorsForComponent.Dependencies == null) { processorsForComponent.Dependencies = new List <EntityProcessor>(); } processorsForComponent.Dependencies.Add(processor); } } MapComponentTypeToProcessors.Add(componentType, processorsForComponent); } // Collect dependent processors var processorsForComponentDependencies = processorsForComponent.Dependencies; if (dependentProcessors != null && processorsForComponentDependencies != null) { for (int i = 0; i < processorsForComponentDependencies.Count; i++) { var processor = processorsForComponentDependencies[i]; if (!dependentProcessors.Contains(processor)) { dependentProcessors.Add(processor); } } } }
internal void NotifyComponentChanged(Entity entity, int index, EntityComponent oldComponent, EntityComponent newComponent) { // No real update if (oldComponent == newComponent) { return; } // If we have a new component we can try to collect processors for it if (newComponent != null) { CollectNewProcessorsByComponentType(newComponent.GetType().GetTypeInfo()); RegisterPendingProcessors(); } // Remove previous component from processors currentDependentProcessors.Clear(); if (oldComponent != null) { CheckEntityComponentWithProcessors(entity, oldComponent, true, currentDependentProcessors); } // Add new component to processors if (newComponent != null) { CheckEntityComponentWithProcessors(entity, newComponent, false, currentDependentProcessors); } // Update all dependencies if (currentDependentProcessors.Count > 0) { UpdateDependentProcessors(entity, oldComponent, newComponent); currentDependentProcessors.Clear(); } // Notify component changes OnComponentChanged(entity, index, oldComponent, newComponent); }