Experience Pipeline

The experience pipeline is how CrimsonCore connects a data asset to a running match. It replaces hardcoded GameMode logic with a data-driven, async-loaded composition layer.

Boot sequence

StepWhoWhat happens
1UCrimsonAssetManagerStartInitialLoading — cue manager init + GameData load
2ACrimsonGameMode::InitGameSchedules HandleMatchAssignmentIfNotExpectingOne next frame
3ACrimsonGameModeResolves experience ID from: CLI → options string → DeveloperSettings → WorldSettings
4UCrimsonExperienceManagerComponentSetCurrentExperience — replicates to clients, starts load state machine
5Both server and clientUnloaded → Loading → LoadingGameFeatures → ExecutingActions → Loaded
6UCrimsonExperienceManagerComponentBroadcasts OnExperienceLoaded (high-priority, standard, low-priority tiers)
7ACrimsonGameModeReceives OnExperienceLoaded (standard priority) → calls RestartPlayer for each waiting PC
8ACrimsonGameModeGetDefaultPawnClassForController uses PawnData.PawnClass; pawn spawned with PawnData injected
9UCrimsonPawnExtensionComponentInit-state machine: Spawned → DataAvailable → DataInitialized → GameplayReady
10UCrimsonHeroComponentOn GameplayReady: binds input from PawnData.InputConfig, activates PawnData.DefaultCameraMode

UCrimsonExperienceDefinition

Primary data asset that defines an entire game session. Referenced by ACrimsonWorldSettings and UCrimsonDeveloperSettings.

PropertyDescription
GameFeaturesToEnableList of GameFeature plugin URLs to activate when this experience loads.
DefaultPawnDataFallback UCrimsonPawnData used when no player-state-level PawnData is set.
ActionsArray of UGameFeatureActions executed after all plugins are active.
ActionSetsArray of UCrimsonExperienceActionSet references — reusable action bundles shared across experiences.

Waiting for the experience in C++

cpp
void UMyComponent::BeginPlay()
{
Super::BeginPlay();
if (ACrimsonGameState* GS = GetWorld()->GetGameState<ACrimsonGameState>())
{
if (UCrimsonExperienceManagerComponent* ExpMgr =
GS->FindComponentByClass<UCrimsonExperienceManagerComponent>())
{
ExpMgr->CallOrRegister_OnExperienceLoaded(
FOnCrimsonExperienceLoaded::FDelegate::CreateUObject(
this, &UMyComponent::OnExperienceReady));
}
}
}
UAsyncAction_ExperienceReady
In Blueprint, use the Wait for Experience Ready async action node. It fires the On Ready pin on both the server and client once the experience is fully loaded and all GameFeatureActions have executed.