Quick Start
1 - Enable the plugin
Open Edit -> Plugins, type Crimson in the search box, tick CrimsonOnlineSubsystem's checkbox, 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.
.uproject or .Build.cs to edit. The editor writes the plugin entry for you. The C++ step below is needed only when you reference CrimsonOnlineSubsystem types from your own C++ code.2 - Pick an online provider in DefaultEngine.ini
This plugin never chooses a provider for you - it reads whichever IOnlineSubsystem your project activates. Enable the provider's own plugin (for example OnlineSubsystemSteam) in Edit -> Plugins, then add its settings to Config/DefaultEngine.ini:
[OnlineSubsystem]DefaultPlatformService=Steam[OnlineSubsystemSteam]bEnabled=true; 480 is Valve's public test AppId (Spacewar). Replace it before shipping.SteamDevAppId=480
Config/CustomTemplates/ folder carries complete DefaultEngine.ini overlays for Steam, EOS and SteamEOS, including the net driver and CompatibleUniqueNetIdTypes entries each provider needs. Copy the one you want into your project's config; nothing loads them from inside the plugin. The header comment in each file explains what it assumes.3 - Configure Project Settings
Open Project Settings -> Crimson -> Crimson Online Subsystem. Set DLCMappingTable if you ship DLC, and set DebugPlatformOverride while testing in PIE - PIE has no storefront launcher to inject a platform, so detection otherwise lands on Unknown or Null. Values are written to Config/DefaultGame.ini.
4 - Login at game start (C++)
Login is fire-and-forget: it takes only a local user index, and the result arrives on the service's OnLoginComplete dynamic multicast delegate. Bind before you call.
// MyOnlineBootstrap.h#pragma once#include "CoreMinimal.h"#include "Subsystems/GameInstanceSubsystem.h"#include "CrimsonOnlineTypes.h"#include "MyOnlineBootstrap.generated.h"UCLASS()class UMyOnlineBootstrap : public UGameInstanceSubsystem{GENERATED_BODY()public:virtual void Initialize(FSubsystemCollectionBase& Collection) override;private:// Must be a UFUNCTION - OnLoginComplete is a dynamic multicast delegate.UFUNCTION()void HandleLoginComplete(bool bSuccess, const FCrimsonOnlinePlayerInfo& PlayerInfo);};// MyOnlineBootstrap.cpp#include "MyOnlineBootstrap.h"#include "CrimsonOnlineSubsystemGI.h"#include "Services/CrimsonOnlineIdentityService.h"void UMyOnlineBootstrap::Initialize(FSubsystemCollectionBase& Collection){Super::Initialize(Collection);if (UCrimsonOnlineSubsystemGI* Online = UCrimsonOnlineSubsystemGI::Get(this)){UCrimsonOnlineIdentityService* Identity = Online->GetIdentityService();Identity->OnLoginComplete.AddDynamic(this, &UMyOnlineBootstrap::HandleLoginComplete);Identity->Login(0);}}void UMyOnlineBootstrap::HandleLoginComplete(bool bSuccess, const FCrimsonOnlinePlayerInfo& PlayerInfo){if (bSuccess){// PlayerInfo.DisplayName / PlayerInfo.PlatformUserId are now populated.}}
5 - Blueprint async login
Right-click in any Blueprint graph and add Login (Online) (UCrimsonAsyncAction_Login). It takes one input, Local User Num (default 0), and has two execution pins, On Success and On Failure; both carry bSuccess and a Player Info struct. The node resolves UCrimsonOnlineSubsystemGI from the world context for you, so there is nothing else to wire.
CrimsonOnlineSubsystem initialized. Platform: <name> from LogCrimsonOnline. Then confirm your On Success branch runs and Player Info -> Display Name is your platform account name. On Steam and EOS on PC login usually completes on the next tick, because the platform has already authenticated the process.UCrimsonOnlineSubsystemGI is a GameInstance subsystem, so it lives on the client and on the server alike, and each PIE instance gets its own. Do not treat login state on one instance as authoritative for another - query the identity service on the instance you are running on.