quarta-feira, 25 de novembro de 2020

A macro USTRUCT()

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.

 

Sumário C++