Skip to content

C++ Program from Scratch

Use C++ when you need performance, source control–friendly logic, or shared code across multiple OS skins. Programs still use UMG widgets — implement the widget in Blueprint or C++ and assign it on the program class defaults.

Base class: UOperatingSystemBaseProgram.

flowchart TB
  subgraph row1[" "]
    direction LR
    Build["Build.cs modules"] --> Header["UMyNativeProgram.h"] --> CPP["UMyNativeProgram.cpp"]
  end
  subgraph row2[" "]
    direction LR
    BPChild["Blueprint child for widgets"] --> Collection["UOperatingSystemProgramsCollection"] --> OS["UOperatingSystem"]
  end
  CPP --> BPChild

In your game module Build.cs:

PrivateDependencyModuleNames.AddRange(new string[]
{
"OperatingSystemSimulator",
"UMG",
"DraggableWindowUMG"
});
#pragma once
#include "Programs/OperatingSystemBaseProgram.h"
#include "MyNativeProgram.generated.h"
UCLASS(Blueprintable)
class UMyNativeProgram : public UOperatingSystemBaseProgram
{
GENERATED_BODY()
public:
UMyNativeProgram();
protected:
virtual void OnValidate(FGenericError& OutError) const override;
virtual void OnProgramStarted() override;
};
#include "MyNativeProgram.h"
UMyNativeProgram::UMyNativeProgram()
{
Name = FText::FromString(TEXT("Native Tool"));
Identifier = FName("com.mygame.nativetool");
Version.Major = 1;
// WidgetClass = LoadClass<UOperatingSystemProgramWidget>(...);
}
void UMyNativeProgram::OnValidate(FGenericError& OutError) const
{
if (WidgetClass.IsNull())
{
OutError = MAKE_ERROR("CONFIG", TEXT("Widget Class is required."));
}
}
void UMyNativeProgram::OnProgramStarted()
{
Super::OnProgramStarted();
// Runtime init — spawn sub-widgets, load data, etc.
}

Create a Blueprint child of UMyNativeProgram to assign Widget Class, icons, and Store metadata in the editor without recompiling for every tweak.

Subclass UOperatingSystemProgramWidget:

UCLASS()
class UMyProgramWidget : public UOperatingSystemProgramWidget
{
GENERATED_BODY()
protected:
virtual void NativeConstruct() override;
};

Use GetOwningProgram() to cast back to UMyNativeProgram.

Add your program class to a UOperatingSystemProgramsCollection Data Asset referenced by your OS Blueprint, or set it on Must Have Programs.

OverrideWhen
OnValidateReject invalid program configs at cook/runtime
OnProgramStartedFirst frame of program process
OnProgramClosedCleanup
OnProcessCommandOnly for terminal-like programs

Full virtual list: API reference.