Existe uma macro na Unreal Engine com o nome UPROPERTY() que é usada para expor variáveis para o editor.
Vamos criar duas variáveis na classe TutoProjectCollectable apenas para ver o uso de UPROPERTY() na prática.
Abra o arquivo TutoProjectCollectable.h e coloque a definição das variáveis UEVersion e SpecialId abaixo das variáveis de componentes como mostra este código:
...
public:
// Sets default values for this actor's properties
ATutoProjectCollectable();
// Called every frame
virtual void Tick(float DeltaTime) override;
UPROPERTY(VisibleAnywhere)
USceneComponent* RootScene;
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* StaticMesh;
UPROPERTY(VisibleAnywhere, Category = Tutorial)
float UEVersion;
UPROPERTY(EditAnywhere, Category = Tutorial)
int32 SpecialId;
...
Uma macro UPROPERTY pode receber especificadores e está relacionada à definição de variável que está abaixo dela. Como exemplos de especificadores temos o VisibleAnywhere, que indica que a propriedade não pode ser editada mas é visível em todas as janelas de propriedades, e o EditAnywhere, que indica que a propriedade pode ser editada em todas as janelas de propriedades.
Outro especificador da UPROPERTY é o Category, que especifica em qual categoria a propriedade será exibida na janela de propriedades.
Como a variável UEVersion não pode ser editada devido o uso do VisibleAnywhere, vamos atribuir um valor para ela no construtor que está no arquivo TutoProjectCollectable.cpp:
...
// Sets default values
ATutoProjectCollectable::ATutoProjectCollectable()
{
UEVersion = 4.25f;
...
Vamos visualizar o uso da UPROPERTY. Compile o projeto e adicione uma instância de TutoProjectCollectable no nível. Selecione a instância e veja as variáveis UPROPERTY na aba Details, na categoria Tutorial. A variável UEVersion é somente leitura e a variável SpecialId pode ser editada como mostra esta imagem:
Uma observação em relação aos ponteiros para componentes. Eles são definidos como UPROPERTY com o especificador VisibleAnywhere. Isto significa que o ponteiro não poderá ser mudado no editor, mas as propriedades do componente podem ser modificadas no editor. Não é preciso defini-los como EditAnywhere.
Vamos criar variáveis para armazenar os limites da área de jogo. Elas serão usadas ao criar novas instâncias de TutoProjectCollectable durante a execução do jogo.
...
UPROPERTY(VisibleAnywhere, Category = Tutorial)
float UEVersion;
UPROPERTY(EditAnywhere, Category = Tutorial)
int32 SpecialId;
UPROPERTY(EditDefaultsOnly, Category = "Game Area")
float XMinimum;
UPROPERTY(EditDefaultsOnly, Category = "Game Area")
float XMaximum;
UPROPERTY(EditDefaultsOnly, Category = "Game Area")
float YMinimum;
UPROPERTY(EditDefaultsOnly, Category = "Game Area")
float YMaximum;
UPROPERTY(EditDefaultsOnly, Category = "Game Area")
float FloorZValue;
...
As variáveis da área de jogo estão definidas como UPROPERTY com o especificador EditDefaultsOnly. Isto significa que estas variáveis poderão ser editadas no editor de Blueprints caso você crie um Blueprints usando o TutoProjectCollectable como classe pai, mas elas não vão aparecer nas janelas de propriedades das instâncias.
Existe outro especificador de UPROPERTY chamado EditInstanceOnly. Neste caso, a variável aparece na janela de propriedades de uma instância, mas não aparece no editor de Blueprints.
As variáveis estão agrupadas em uma categoria chamada "Game Area". O uso das aspas é necessário por causa do espaço em branco que existe no nome da categoria.
Os valores das variáveis da área de jogo são atribuídos no arquivo TutoProjectCollectable.cpp, dentro do construtor:
...
// Sets default values
ATutoProjectCollectable::ATutoProjectCollectable()
{
UEVersion = 4.25f;
//Default Values for Game Area
XMinimum = -1800.0f;
XMaximum = 1000.0f;
YMinimum = -1400.0f;
YMaximum = 1400.0f;
FloorZValue = 130.0f;
...