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.
LoadingScreenHow loading screens look while this experience is current - bShowCharacterShowcase, Background, Widget, TipCategory. Installed when the experience finishes loading and kept until another experience replaces it.
Two assets carry the loading screen block
FCrimsonExperienceLoadingScreen is authored on both experience assets and they answer different questions. On UCrimsonUserFacingExperienceDefinition it styles the travel into an experience, applied by the machine that starts the travel. On UCrimsonExperienceDefinition it styles every load that leaves it, installed by UCrimsonExperienceManagerComponent once the experience is loaded - which is what covers in-game travels, ServerTravel, and clients that joined a session already in progress, since OnRep_CurrentExperience brings clients down the same path.

bShowCharacterShowcase is a request, not a guarantee: the showcase also needs a character registered with the loading screen manager and falls back to the normal background when there is none. See CrimsonLoadingScreen -> How-To: Control the Screen Per Load (optional).

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.