In this lesson, you will learn how to create custom, reflected data structures using USTRUCT to organize your game data efficiently.
The Role of USTRUCTs
In Unreal Engine, USTRUCT is the go-to tool for creating "value types." Unlike UObject classes, which are heavy and managed by the Garbage Collector, USTRUCTs are lightweight containers that exist on the stack or as member variables within other objects. They are perfect for grouping related pieces of data—like item statistics or character attributes—into a single, neat package that the editor can understand.
Defining a Reflected Structure
To make a struct visible to Unreal’s reflection system (allowing you to edit it in the Inspector or serialize it), you must follow a specific pattern. You define the struct with USTRUCT(BlueprintType) and ensure it has a generated body macro.
Here is a simple example of an item definition structure:
#include "CoreMinimal.h"
#include "MyGameItem.generated.h"
USTRUCT(BlueprintType)
struct FItemData
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventory")
FName ItemName;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventory")
int32 Quantity;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventory")
float Weight;
};
Why Use Them?
When you mark your variables with UPROPERTY, Unreal’s reflection system "sees" them. This grants you several major benefits:
- Editor Integration: Because you marked the struct
BlueprintType, you can expose it as a variable in Blueprints, allowing designers to edit the values directly in the Details panel. - Serialization: Unreal automatically handles saving and loading these values when you save a level or a data asset.
- Memory Efficiency: Since
USTRUCTsdon't require the overhead of the Garbage Collector (unlikeUObjectinstances), they are highly performant for storing large arrays of data, such as inventory lists or quest logs.
By wrapping related data into a USTRUCT, you turn scattered, disorganized variables into clean, reusable data containers that bridge the gap between C++ logic and Blueprint design.
Key Takeaway: Use USTRUCTs to create lightweight, reflected data containers that provide easy Editor integration and efficient memory usage without the overhead of Garbage Collection.