Uma estrutura é um tipo de dado composto que permite agrupar variáveis de diferentes tipos em um único tipo. A macro USTRUCT() permite a criação de estruturas que podem ser usadas no Editor da Unreal e em Blueprints.
Na Unreal Engine as estruturas possuem o prefixo F em C++. Para implementar uma estrutura em C++, crie um arquivo cabeçalho (.h) com o nome da estrutura, por exemplo, StructExample.h. O código abaixo mostra um exemplo de USTRUCT() que pode ser usada em Blueprints.
#pragma once
#include "CoreMinimal.h"
#include "StructExample.generated.h"
USTRUCT(BlueprintType)
struct FStructExample
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 IntegerVariable;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float FloatVariable;
//Outras variáveis...
};
O especificador BlueprintType permite que a estrutura seja usada como tipo de uma variável em um Blueprint. Nesta imagem está sendo criada uma variável com o nome MyStruct usando a estrutura StructExample como tipo:
A imagem abaixo mostra como as variáveis de uma estrutura são exibidas na aba de detalhes de uma instância.
A Unreal Engine cria as funções Make e Break da estrutura para serem usados no EventGraph de um Blueprint:
Exemplo de uso:
Vamos criar a estrutura FItemShop que contém informações de um item que pode ser vendido ao jogador. Crie o arquivo cabeçalho ItemShop.h e adicione este código:
#pragma once
#include "CoreMinimal.h"
#include "Engine/Texture.h"
#include "ItemShop.generated.h"
USTRUCT(BlueprintType)
struct FItemShop
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString Name;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
bool bShow;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Value;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 Amount;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture* Image;
};
Vamos usar a estrutura FItemShop em uma classe C++. No editor da Unreal, crie uma classe C++ com o nome Seller (vendedor) usando como classe pai a classe Actor. O arquivo Seller.h deve ter este conteúdo:
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ItemShop.h"
#include "Seller.generated.h"
UCLASS()
class TUTOPROJECT_API ASeller : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ASeller();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnywhere, Category=Seller)
TArray<FItemShop> Inventory;
UPROPERTY(VisibleAnywhere)
USceneComponent* RootScene;
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* StaticMesh;
};
Nós criamos um TArray para armazenar elementos do tipo FItemShop. TArray é um container que armazena uma sequência de elementos. Veremos os conceitos de TArray com mais detalhes em outro artigo.
No arquivo Seller.cpp, é preciso criar os componentes no construtor. O StaticMesh usado pelo Seller será definido no editor da Unreal.
#include "Seller.h"
ASeller::ASeller()
{
// Set this actor to call Tick() every frame.
PrimaryActorTick.bCanEverTick = true;
RootScene = CreateDefaultSubobject<USceneComponent>("RootScene");
RootComponent = RootScene;
StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>("StaticMesh");
StaticMesh->SetupAttachment(RootScene);
}
...
Compile o código C++ e adicione uma instância de Seller no nível. Você pode selecionar um StaticMesh para representar o Seller na aba Details da instância:
Também está disponível na aba Details da instância, o nosso TArray chamado Inventory. Os elementos deste TArray são do tipo FItemShop. Você pode adicionar elementos e definir o conteúdo de cada um dos elementos.