quinta-feira, 3 de setembro de 2020

Classe TutoProjectCollectable: UPROPERTY()

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 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.

Coloque a definição das novas variáveis no arquivo TutoProjectCollectable.h depois das variáveis UEVersion e SpecialId, como mostra o código abaixo:
...

	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;

...


Sumário C++