Concept: What an Experience Is

A traditional AGameMode answers what is this session made of? in C++, so a new mode means a new class, and a mode that shares 90% of another's setup shares it by inheritance or copy-paste. Both age badly.

An Experience moves that answer into data. The asset lists Game Feature plugins to activate and UGameFeatureActions to run; the manager component executes them. Your game mode shrinks to choosing an experience.

The three assets

AssetAnswersAuthored as
UCrimsonExperienceDefinitionWhat is this session made of?Blueprint class (it is Const and Blueprintable)
UCrimsonExperienceActionSetWhat do several sessions share?Data asset (NotBlueprintable)
UCrimsonUserFacingExperienceDefinitionHow is this session offered to the player?Blueprint class

Why actions rather than a settings struct

A settings struct on the experience would have to name every system it can configure - which means this plugin would have to know about inventories, skill trees and ability sets, and every new system would edit this plugin.

UGameFeatureAction inverts that. The experience holds TArray<TObjectPtr<UGameFeatureAction>> and nothing more specific. Each plugin ships its own action; the picker fills with whatever is installed. UCrimsonExperienceDefinition has no include from any gameplay plugin, which is what lets you own three Crimson plugins and still use experiences.

Why pawn data is an empty base class

DefaultPawnData is a UCrimsonPawnDataBase, which declares no properties at all. Real pawn data aggregates ability sets, input configs and camera modes from several plugins - typing the property as that would drag every one of them into this plugin's dependencies. The empty base keeps the reference typed without the coupling; your game mode casts back down to the concrete type it owns.

See also

  • Concept: The Load Sequence
  • How-To: Share Actions with an Action Set