Unreal Cpp Gameplay

by gamedev-skillsd4b0e35550c5No license1.3K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 11 days ago

Write Unreal Engine 5 C++ gameplay code: the UCLASS/UPROPERTY/UFUNCTION reflection macros, the Gameplay Framework (GameMode, Pawn, Character, PlayerController, Actor components), and the module Build.cs. Use when writing or debugging UE C++, deriving from AActor/ACharacter/ AGameModeBase, exposing properties to the editor or Blueprints, or when the user mentions Unreal C++, UCLASS, GENERATED_BODY, GameMode, ACharacter, or .Build.cs.

Instructions onlySoftware Development
AI-generated overview

Guides writing Unreal Engine 5 C++ gameplay code: reflection macros, Gameplay Framework classes, and Build.cs modules.

What it does
This skill provides instructions for writing Unreal Engine 5 gameplay C++ targeting UE 5.8. It covers the UCLASS, UPROPERTY, UFUNCTION and GENERATED_BODY reflection macros, class naming prefixes, component creation, Gameplay Framework class roles, and module dependencies in Build.cs. It also lists common pitfalls and verification steps, and points to a bundled reference on actor components and garbage collection.
When to use it
Use it when creating or debugging UE C++ gameplay classes such as AActor, APawn, ACharacter, AGameModeBase or UActorComponent. It fits work that exposes properties or functions to the editor or Blueprints, wires a GameMode's default classes, or adds a module dependency in a Build.cs file.
Requirements
No scripts; instructions only. It assumes an Unreal Engine 5 C++ project with a Source tree and Build.cs files, and a compiler or editor build workflow for verification. One bundled reference file is read by the agent.

Unreal C++ Gameplay

Write correct UE5 gameplay C++: the reflection macros that connect C++ to the editor and Blueprints, the Gameplay Framework class roles, and module dependencies. Targets UE 5.8.

When to use

  • Use when creating C++ gameplay classes (AActor, APawn, ACharacter, AGameModeBase, UActorComponent), exposing properties/functions with UPROPERTY/UFUNCTION, setting up a GameMode's default classes, or adding a module dependency in *.Build.cs.
  • Use when the project has a Source/ tree with *.h/*.cpp using UCLASS, and *.Build.cs.

When not to use: designer-facing visual logic → unreal-blueprints. Player input binding details → unreal-enhanced-input. AI logic → unreal-behavior-trees. This skill owns the C++ class/reflection foundation those build on.

Core workflow

  1. Name with the right prefix. A = Actor-derived, U = UObject/component-derived, F = plain struct, E = enum, I = interface. The prefix must match the base class.
  2. Declare the class with reflection macros. UCLASS() above the class, GENERATED_BODY() as the first line in the body, and #include "ClassName.generated.h" as the last include in the header.
  3. Expose data with UPROPERTY (editor/Blueprint visibility and garbage-collection tracking) and behaviour with UFUNCTION (BlueprintCallable, etc.).
  4. Create components in the constructor with CreateDefaultSubobject<T>(TEXT("Name")) and set the RootComponent.
  5. Know the framework roles: AGameModeBase sets the rules + default classes; APawn/ ACharacter is the controllable body; APlayerController is the player's will; UActorComponent is reusable behaviour.
  6. Add module dependencies to *.Build.cs (e.g. EnhancedInput) or unresolved-symbol link errors follow.
  7. Verify by compiling (Live Coding Ctrl+Alt+F11 for function bodies; full rebuild for header/UPROPERTY changes) and checking the class/properties appear in the editor.

Patterns

1. Minimal Actor class (header + source)

cpp
// Pickup.h#pragma once#include "CoreMinimal.h"#include "GameFramework/Actor.h"#include "Pickup.generated.h"          // MUST be the last include
UCLASS()class MYGAME_API APickup : public AActor   // MYGAME_API = your module's export macro{    GENERATED_BODY()public:    APickup();
    // EditAnywhere = tweak per-instance & on the CDO; BlueprintReadWrite = BP get/set.    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pickup")    int32 ScoreValue = 10;
    // UPROPERTY on a UObject* pointer is what keeps it from being garbage-collected.    UPROPERTY(VisibleAnywhere)    TObjectPtr<UStaticMeshComponent> Mesh;   // UE5: TObjectPtr instead of raw UStaticMeshComponent*
    UFUNCTION(BlueprintCallable, Category = "Pickup")    void Collect();
protected:    virtual void BeginPlay() override;};
cpp
// Pickup.cpp#include "Pickup.h"#include "Components/StaticMeshComponent.h"
APickup::APickup(){    Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));    RootComponent = Mesh;                     // the mesh is this actor's root}
void APickup::BeginPlay() { Super::BeginPlay(); }   // always call Supervoid APickup::Collect()   { Destroy(); }

2. GameMode wiring its default classes

cpp
// MyGameMode.cpp — set in the constructor so the engine spawns your classes.AMyGameMode::AMyGameMode(){    DefaultPawnClass      = AMyCharacter::StaticClass();    PlayerControllerClass = AMyPlayerController::StaticClass();}

3. Module dependency in Build.cs

csharp
// MyGame.Build.csPublicDependencyModuleNames.AddRange(new string[]{    "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput"});

Pitfalls

  • generated.h not last / missing — compile errors like "Cannot find generated header" or "Expected an include". It must be the final include in the header.
  • Forgetting GENERATED_BODY() — UHT (Unreal Header Tool) errors; it must be the first thing inside the class body.
  • Raw UObject* without UPROPERTY — the garbage collector doesn't see it and may destroy it out from under you. Track every UObject pointer with UPROPERTY (use TObjectPtr in UE5).
  • Header/UPROPERTY edits with Live Coding — Live Coding handles function bodies, but changes to UCLASS/UPROPERTY/headers need a full editor restart + rebuild.
  • Wrong class prefix — naming an Actor UFoo (or a component AFoo) breaks UHT; match the prefix to the base type.
  • Unresolved external symbol at link — the module providing the API isn't in Build.cs PublicDependencyModuleNames.
  • Not calling Super:: in overridden BeginPlay/Tick/etc. skips engine setup.

References

  • For UActorComponent creation/attachment, the UPROPERTY garbage-collection ownership rules (TObjectPtr, TArray<TObjectPtr<>>, AddToRoot), and a replication primer, read references/components-and-gc.md.
  • Primary docs: "Unreal Engine CPP Quick Start" and "Gameplay Framework" (https://dev.epicgames.com/documentation/en-us/unreal-engine/gameplay-framework-in-unreal-engine).

Related skills

  • unreal-blueprints — exposing C++ to designers; BP/C++ interop.
  • unreal-enhanced-input — binding input in a C++ Pawn/Character.
  • unreal-behavior-trees — C++ AI tasks driven from a behaviour tree.

Source and attribution

Source:gamedev-skills/awesome-gamedev-agent-skillsinskills/unreal/unreal-cpp-gameplayat commitd4b0e35

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal

More from gamedev-skills/awesome-gamedev-agent-skills

Unreal Cpp Gameplay Agent Skill | SourceWeft