Global vs Content Entities
This article explains the difference between global and content entities and how they are loaded during startup. For startup specifics, see Startup Process.
Global Entities
Global Entities are entities that are globally accessible from all Contents, such as Event Settings. Their data resides in the global entities database and the entities' instances persist when switching content.
Note
Users should be careful about what is put in global data since it will always be loaded into memory. Hence, data should only be global when necessary to avoid memory issues.
Content Specific Entities
Content specific Entities are entities that are only accessible from a specific content. This accounts for a majority of entities in IdleKit, such as IContent, IStage, and IGeneratorEntity. Their data resides in a specific content's entities database and the entities are unloaded when switching content.
Loading & Unloading Flow
Global Entities Flow
Content Entities Flow
Loading Global Entities
Loading of global entities must be handled by services that are in charge of loading independent entities, including:
- IEventService - Loads all Event Settings
- ICurrencyService - Loads all Currencies
- IRewardService - Loads all Rewards
- IModifierService - Loads all Modifier Formulas
- ITrackService - Loads all Tracks and Timed Tracks
These services subscribe to the StaticDataAddedAction
and StaticDataRemovedAction
that is fired by the IDataLoaderService. Whenever entity data of an assignable type is added/removed, the services load/unload the entities, regardless of whether the data is global or content-specific. Since global data is loaded on StartGame() and only unloaded on ResetGame(Boolean), global entities persist when switching content. When switching content, content data is unloaded, so services unload the content specific entities.
e.g. Currency Service loading Currencies
protected virtual void OnStaticDataAdded(StaticDataAddedAction staticDataAddedAction)
{
foreach (Type type in staticDataAddedAction.dataIdDict.Keys)
{
if (typeof(ICurrencyData).IsAssignableFrom(type))
{
_entityLoaderService.LoadEntities<ICurrency, ICurrencyData>(staticDataAddedAction.dataIdDict[type].ToArray());
}
}
}
protected virtual void OnStaticDataRemoved(StaticDataRemovedAction staticDataRemovedAction)
{
foreach (Type type in staticDataRemovedAction.dataIdDict.Keys)
{
if (typeof(ICurrencyData).IsAssignableFrom(type))
{
ICurrency[] currencies = _entityResolver.ResolveAll<ICurrency>(staticDataRemovedAction.dataIdDict[type].ToArray());
_entityLoaderService.UnloadEntities(currencies);
}
}
}
Note
If you wish to load another type of entity globally, a service must be made to load and unload these entities when StaticDataAddedAction
and StaticDataRemovedAction
are fired.