Game.Serialization.RequiredComponentSystem
Assembly: Assembly-CSharp
Namespace: Game.Serialization
Type: class
Base: GameSystemBase
Summary:
RequiredComponentSystem is an ECS system that runs during game load/serialization to ensure entities have the correct set of components (and component data/buffers/shared components) for the current game version. It contains a large set of EntityQuery fields targeted at detecting entities missing specific components (or having components that need migration) and, on update, it adds/removes components, initializes buffers, sets default component data, and performs migration/cleanup tasks depending on the save/context version. This system is responsible for many compatibility and initialization steps when loading maps or migrating old saves to newer data layouts.
Fields
-
private LoadGameSystem m_LoadGameSystem
Used to access the current load context (version/purpose). Frequently consulted to make version-dependent migration decisions and to get the load Context. -
private EntityQuery m_BlockedLaneQuery private EntityQuery m_CarLaneQueryprivate EntityQuery m_BuildingEfficiencyQueryprivate EntityQuery m_PolicyQueryprivate EntityQuery m_CityModifierQueryprivate EntityQuery m_ServiceDispatchQueryprivate EntityQuery m_PathInformationQueryprivate EntityQuery m_NodeGeometryQueryprivate EntityQuery m_MeshColorQueryprivate EntityQuery m_MeshBatchQueryprivate EntityQuery m_RoutePolicyQueryprivate EntityQuery m_RouteModifierQueryprivate EntityQuery m_EdgeQueryprivate EntityQuery m_StorageTaxQueryprivate EntityQuery m_CityFeeQueryprivate EntityQuery m_CityFeeQuery2private EntityQuery m_ServiceFeeParameterQueryprivate EntityQuery m_OutsideGarbageQueryprivate EntityQuery m_OutsideFireStationQueryprivate EntityQuery m_OutsidePoliceStationQueryprivate EntityQuery m_OutsideEfficiencyQueryprivate EntityQuery m_RouteInfoQueryprivate EntityQuery m_CompanyProfitabilityQueryprivate EntityQuery m_StorageQueryprivate EntityQuery m_RouteBufferIndexQueryprivate EntityQuery m_CurveElementQueryprivate EntityQuery m_CitizenPrefabQueryprivate EntityQuery m_CitizenNameQueryprivate EntityQuery m_HouseholdNameQueryprivate EntityQuery m_LabelVertexQueryprivate EntityQuery m_DistrictNameQueryprivate EntityQuery m_AnimalNameQueryprivate EntityQuery m_HouseholdPetQueryprivate EntityQuery m_RoadNameQueryprivate EntityQuery m_RouteNumberQueryprivate EntityQuery m_ChirpRandomLocQueryprivate EntityQuery m_BlockerQueryprivate EntityQuery m_CitizenPresenceQueryprivate EntityQuery m_SubLaneQueryprivate EntityQuery m_SubObjectQueryprivate EntityQuery m_NativeQueryprivate EntityQuery m_GuestVehicleQueryprivate EntityQuery m_TravelPurposeQueryprivate EntityQuery m_TreeEffectQueryprivate EntityQuery m_TakeoffLocationQueryprivate EntityQuery m_LeisureQueryprivate EntityQuery m_PlayerMoneyQueryprivate EntityQuery m_PseudoRandomSeedQueryprivate EntityQuery m_TransportDepotQueryprivate EntityQuery m_ServiceUsageQueryprivate EntityQuery m_OutsideSellerQueryprivate EntityQuery m_LoadingResourcesQueryprivate EntityQuery m_CompanyVehicleQueryprivate EntityQuery m_LaneRestrictionQueryprivate EntityQuery m_LaneOverlapQueryprivate EntityQuery m_DispatchedRequestQueryprivate EntityQuery m_HomelessShelterQueryprivate EntityQuery m_QueueQueryprivate EntityQuery m_BoneHistoryQueryprivate EntityQuery m_UnspawnedQueryprivate EntityQuery m_ConnectionLaneQueryprivate EntityQuery m_AreaLaneQueryprivate EntityQuery m_OfficeQueryprivate EntityQuery m_VehicleModelQueryprivate EntityQuery m_PassengerTransportQueryprivate EntityQuery m_ObjectColorQueryprivate EntityQuery m_OutsideConnectionQueryprivate EntityQuery m_NetConditionQueryprivate EntityQuery m_NetPollutionQueryprivate EntityQuery m_TrafficSpawnerQueryprivate EntityQuery m_AreaExpandQueryprivate EntityQuery m_EmissiveQueryprivate EntityQuery m_TrainBogieFrameQueryprivate EntityQuery m_EditorContainerQueryprivate EntityQuery m_ProcessingTradeCostQueryprivate EntityQuery m_StorageConditionQueryprivate EntityQuery m_LaneColorQueryprivate EntityQuery m_CompanyNotificationQueryprivate EntityQuery m_PlantQueryprivate EntityQuery m_CityPopulationQueryprivate EntityQuery m_CityTourismQueryprivate EntityQuery m_LaneElevationQueryprivate EntityQuery m_BuildingNotificationQueryprivate EntityQuery m_AreaElevationQueryprivate EntityQuery m_BuildingLotQueryprivate EntityQuery m_AreaTerrainQueryprivate EntityQuery m_OwnedVehicleQueryprivate EntityQuery m_EdgeMappingQueryprivate EntityQuery m_SubFlowQueryprivate EntityQuery m_PointOfInterestQueryprivate EntityQuery m_BuildableAreaQueryprivate EntityQuery m_SubAreaQueryprivate EntityQuery m_CrimeVictimQueryprivate EntityQuery m_ArrivedQueryprivate EntityQuery m_MailSenderQueryprivate EntityQuery m_CarKeeperQueryprivate EntityQuery m_NeedAddHasJobSeekerQueryprivate EntityQuery m_NeedAddPropertySeekerQueryprivate EntityQuery m_AgeGroupQueryprivate EntityQuery m_PrefabRefQueryprivate EntityQuery m_LabelMaterialQueryprivate EntityQuery m_ArrowMaterialQueryprivate EntityQuery m_LockedQueryprivate EntityQuery m_OutsideUpdateQueryprivate EntityQuery m_WaitingPassengersQueryprivate EntityQuery m_ObjectSurfaceQueryprivate EntityQuery m_WaitingPassengersQuery2private EntityQuery m_PillarQueryprivate EntityQuery m_LegacyEfficiencyQueryprivate EntityQuery m_SignatureQueryprivate EntityQuery m_SubObjectOwnerQueryprivate EntityQuery m_DangerLevelMissingQueryprivate EntityQuery m_MeshGroupQueryprivate EntityQuery m_UpdateFrameQueryprivate EntityQuery m_FenceQueryprivate EntityQuery m_NetGeometrySectionQueryprivate EntityQuery m_NetLaneArchetypeDataQueryprivate EntityQuery m_PathfindUpdatedQueryprivate EntityQuery m_RouteColorQueryprivate EntityQuery m_CitizenQueryprivate EntityQuery m_ServiceUpkeepQueryprivate EntityQuery m_MoveableBridgeQuery
(Notes: the class contains a very large collection of EntityQuery fields — each targets entities that need specific components added/removed or initialised. Above is a representative listing of the queries present in the source.)
-
private TypeHandle __TypeHandle
Compiler-generated handle struct used by the generated system code to assign type handles; used during OnCreateForCompiler. -
private EntityQuery __query_1938549531_0
Internal/compiled query used to obtain TimeData including system inclusion options. Used by parts of the update logic (e.g., aging/death-wave mitigation).
Properties
- None (this system does not expose public properties)
Constructors
public RequiredComponentSystem()
Default constructor. In ECS systems this typically just calls base constructor; initialization of EntityQuery fields happens in OnCreate.
Methods
-
protected override void OnCreate(): System.Void
Initializes the system: obtains the LoadGameSystem (m_LoadGameSystem), constructs a large number of EntityQuery objects (one per migration/initialization case) that identify entities missing expected components or requiring migration, and prepares any internal handles/queries used later. -
protected override void OnUpdate(): System.Void
Core migration/initialization logic run every update during load. For each EntityQuery the method checks whether the query is non-empty (via IsEmptyIgnoreFilter) and performs appropriate actions: - Adds missing components (AddComponent / AddComponentData).
- Removes obsolete components.
- Adds/initializes dynamic buffers and shared components.
- Sets default component data (e.g., Profitability, ServiceUsage, CitizenPresence).
- Performs version-dependent migrations/cleanup using the load context (m_LoadGameSystem.context.version) and context.purpose (LoadMap vs LoadGame).
- Destroys entities with missing owners or invalid prefab references in some cases.
-
Handles special cases such as reseeding pseudo-random seeds, initializing update frames, moving data between components, enabling/disabling components introduced as "enableable" features, and other compatibility steps. This method is the main place where save-version upgrades and required component enforcement occur.
-
private void __AssignQueries(ref SystemState state): System.Void
Internal helper that builds compiled EntityQuery objects (e.g., __query_1938549531_0). It is used from OnCreateForCompiler to construct queries that include system options (IncludeSystems) and is part of generated/compiled system wiring. -
protected override void OnCreateForCompiler(): System.Void
Compiler-generated entry called during system creation in compiled form. Calls base.OnCreateForCompiler(), assigns compiled queries via __AssignQueries, and initializes type handles via __TypeHandle.__AssignHandles. This method supports the DOTS codegen/compilation path. -
[Preserve] protected override void OnUpdate()and other methods are marked Preserve to avoid stripping; many internal calls (EntityManager.AddComponent, TryGetComponent, GetComponentData, ToEntityArray, etc.) are used throughout.
Usage Example
[Preserve]
protected override void OnCreate()
{
base.OnCreate();
// Example: obtain the load system to read context/version for migrations
m_LoadGameSystem = base.World.GetOrCreateSystemManaged<LoadGameSystem>();
// Example: create an EntityQuery for entities that have Car but are missing BlockedLane
m_BlockedLaneQuery = GetEntityQuery(ComponentType.ReadOnly<Car>(), ComponentType.Exclude<BlockedLane>());
}
Notes and tips for modders: - This system runs many version-dependent migrations. If your mod introduces new components or changes serialization, consider integrating with the load pipeline (e.g., check context.version or provide your own upgrade logic) so older saves can be migrated safely. - Avoid duplicating expensive EntityQuery creation each update — define queries in OnCreate as shown in this class. - Be careful when adding/removing components during load: ensure any buffers/components you add are compatible with how your systems expect entities to be structured at runtime.