Integration

Eleven steps to get CrimsonCore booting in your project. Steps 7 (Game Instance) and 8 (Default Input Component) are the most common sources of silent-failure bugs — don't skip them.

1. Enable the plugin

Open Edit → Plugins, type Crimson in the search box, tick CrimsonCore's checkbox (plus the Crimson plugins it depends on — the Plugins window flags them as required), and restart the editor when prompted. For a Blueprint project that's the entire install — you never hand-edit the .uproject or any .Build.cs.

Screenshot pendingImages/CrimsonCore/qs-enable-plugin.png
Edit → Plugins → search 'Crimson' → tick CrimsonCore's Enabled checkbox → restart the editor.
Blueprint-only project?
Enabling the plugin in Edit → Plugins is the whole installation — there is no .uproject or .Build.cs to edit. The editor writes the plugin entry for you. The C++ step below is needed only when you reference CrimsonCore types from your own C++ code.

C++ projects: after enabling the plugin above, add its module to your build file so your game code can use its types:

csharp
// YourGame.Build.cs
PublicDependencyModuleNames.Add("CrimsonCore");

2. Set the Asset Manager class

UCrimsonAssetManager is the boot entry point. Without it, the gameplay cue manager is never initialized and UCrimsonGameData::Get() will fatal. In Config/DefaultEngine.ini add:

ini
[/Script/Engine.Engine]
AssetManagerClassName=/Script/CrimsonCore.CrimsonAssetManager

Alternatively: Project Settings → Engine → General Settings → Asset Manager Class Name/Script/CrimsonCore.CrimsonAssetManager.

3. Configure Game Data, Default Pawn Data, and Logging

Open Project Settings → Crimson → Crimson Core and set:

SettingDescription
Game Data PathSoft ref to your UCrimsonGameData data asset. Loaded once at boot.
Default Pawn DataFallback UCrimsonPawnData used when a player's PlayerState has no PawnData.
Verbose LoggingWhen on, CRIMSON_LOG_VERBOSE / _INFO / _DISPLAY print to the log. Warnings, Errors, and Fatals always print. Off by default; turn on while diagnosing CrimsonCore behavior.
Create the GameData asset
In the Content Browser, right-click → Miscellaneous → Data Asset → pick CrimsonGameData. Assign your global Damage, Heal, ShieldRegenCooldown, and DynamicTag GameplayEffects. The AttributeMetadata field is optional. No PrimaryAssetTypesToScan registration is needed — the asset is loaded directly by path.

4. Set the Gameplay Cue Manager class

Tells GAS to use UCrimsonGameplayCueManager. Without this setting the boot-time cue preload is skipped and gameplay cues will not fire:

ini
[/Script/GameplayAbilities.AbilitySystemGlobals]
GlobalGameplayCueManagerClass=/Script/CrimsonAbilitySystem.CrimsonGameplayCueManager

5. Set the GameFeature policy class

Registers the cue-path observer so gameplay cue paths declared in GameFeature plugins are picked up at feature registration time:

ini
[/Script/GameFeatures.GameFeaturesSubsystemSettings]
GameFeaturesManagerClassName=/Script/CrimsonCore.CrimsonGameFeaturePolicy

6. Set the WorldSettings class

Allows each level to specify a default experience via ACrimsonWorldSettings:

ini
[/Script/Engine.Engine]
WorldSettingsClassName=/Script/CrimsonCore.CrimsonWorldSettings

7. Set base classes in Project Settings

SettingValue
Default Game ModeACrimsonGameMode (or subclass)
Default Game StateACrimsonGameState
Default Player StateACrimsonPlayerState
Default Player ControllerACrimsonCommonPlayerController
Default PawnNone — driven by UCrimsonPawnData inside the experience
Game InstanceRequired — a Blueprint or C++ subclass of UCrimsonCommonGameInstance
Game Instance is not optional
UCrimsonCommonGameInstance::Init() calls UGameFrameworkComponentManager::RegisterInitState() for the four InitState.* tags. Without this registration the manager's IsInitStateAfterOrEqual returns false for every non-equal tag pair, which silently deadlocks UCrimsonPawnExtensionComponent and UCrimsonHeroComponent at the DataAvailableDataInitialized step (no input, no camera mode). The base class is Abstract; you must either create a Blueprint subclass (e.g. BP_CrimsonGameInstance) and set it as Game Instance Class in Project Settings → Maps & Modes, or create a concrete C++ subclass and reference that.

8. Set the default Input Component class

UCrimsonHeroComponent::InitializePlayerInput casts the pawn's InputComponent to UCrimsonInputComponent to bind native input actions and ability inputs. If the engine creates a plain UEnhancedInputComponent because the project default is unset, the cast fails (ensureMsgf) and gameplay abilities never get bound. In Config/DefaultInput.ini:

ini
[/Script/Engine.InputSettings]
DefaultInputComponentClass=/Script/CrimsonInput.CrimsonInputComponent
Changes require an editor restart
DefaultInputComponentClass is cached once at editor startup. After changing the ini, restart the editor before re-running PIE — otherwise the engine will continue spawning the previously-cached class.

9. Create an ExperienceDefinition

Create a UCrimsonExperienceDefinition data asset. Set DefaultPawnData to a UCrimsonPawnData asset that references your input config, camera mode, and ability set. Add GameFeatureActions. Assign the asset in your level's ACrimsonWorldSettings → DefaultExperience.

10. Configure the PlayerCameraManager

In your GameMode constructor, assign ACrimsonPlayerCameraManager so the UI camera priority system works:

cpp
AMyGameMode::AMyGameMode()
{
PlayerCameraManagerClass = ACrimsonPlayerCameraManager::StaticClass();
}

11. Register actors with GameFrameworkComponentManager

ACrimsonCharacter, ACrimsonPlayerState, and HUD classes do this automatically. Any custom actor that should receive GFA component additions must call:

cpp
UGameFrameworkComponentManager::AddReceiver(this); // BeginPlay
UGameFrameworkComponentManager::RemoveReceiver(this); // EndPlay