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
Module setup
Section titled “Module setup”In your game module Build.cs:
PrivateDependencyModuleNames.AddRange(new string[]{ "OperatingSystemSimulator", "UMG", "DraggableWindowUMG"});Header
Section titled “Header”#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;};Source
Section titled “Source”#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.}Blueprint child (recommended)
Section titled “Blueprint child (recommended)”Create a Blueprint child of UMyNativeProgram to assign Widget Class, icons, and Store metadata in the editor without recompiling for every tweak.
Widget in C++
Section titled “Widget in C++”Subclass UOperatingSystemProgramWidget:
UCLASS()class UMyProgramWidget : public UOperatingSystemProgramWidget{ GENERATED_BODY()
protected: virtual void NativeConstruct() override;};Use GetOwningProgram() to cast back to UMyNativeProgram.
Register with the OS
Section titled “Register with the OS”Add your program class to a UOperatingSystemProgramsCollection Data Asset referenced by your OS Blueprint, or set it on Must Have Programs.
Override cheat sheet
Section titled “Override cheat sheet”| Override | When |
|---|---|
OnValidate | Reject invalid program configs at cook/runtime |
OnProgramStarted | First frame of program process |
OnProgramClosed | Cleanup |
OnProcessCommand | Only for terminal-like programs |
Full virtual list: API reference.
Related
Section titled “Related”- Create a custom program — Blueprint-first walkthrough
- C++ Reference — headers and modules
- New Program — validation with
MAKE_ERROR