Klasa TutoProjectCollectable – UPROPERTY()

W Unreal Engine istnieje makro o nazwie UPROPERTY(), które służy do udostępniania zmiennych edytorowi.

Stwórzmy zatem dwie zmienne w klasie TutoProjectCollectable, aby zobaczyć w praktyce użycie UPROPERTY().

Otwórz plik TutoProjectCollectable.h i umieść definicję zmiennych UEVersion i SpecialId poniżej zmiennych składowych, jak pokazano w poniższym kodzie:

...

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;

...

Makro UPROPERTY może odbierać specyfikatory i jest związane z definicją zmiennej znajdującej się poniżej. Przykładami specyfikatorów są VisibleAnywhere, co oznacza, że właściwość nie może być edytowana, ale jest widoczna we wszystkich oknach właściwości, oraz EditAnywhere, co oznacza, że właściwość można edytować we wszystkich oknach właściwości.

Innym specyfikatorem UPROPERTY jest Category, która określa, w jakiej kategorii właściwość będzie wyświetlana w oknie właściwości.

Ponieważ zmienna UEVersion nie może być edytowana ze względu na użycie VisibleAnywhere, przypiszemy jej wartość w konstruktorze, który znajduje się w pliku TutoProjectCollectable.cpp:

...

// Sets default values
ATutoProjectCollectable::ATutoProjectCollectable()
{

	UEVersion = 4.25f;

...

Sprawdź użycie UPROPERTY, skompiluj projekt i dodaj TutoProjectCollectable do poziomu. Wybierz instancję i zobacz zmienne UPROPERTY na karcie Details w kategorii Tutorial. Zmienna UEVersion jest tylko do odczytu, a zmienną SpecialId można edytować, jak pokazano na tym obrazku:

Uwaga dotycząca wskaźników do komponentów – są one zdefiniowane jako UPROPERTY ze specyfikatorem VisibleAnywhere. Oznacza to, że wskaźnika nie można zmienić w edytorze, ale właściwości komponentu można modyfikować w edytorze. Nie ma potrzeby definiowania ich jako EditAnywhere.

Stworzymy zmienne do przechowywania granic obszaru gry. Będą one używane podczas tworzenia nowych instancji TutoProjectCollectable i podczas działania gry.

Umieść definicję nowych zmiennych w pliku TutoProjectCollectable.h po zmiennych UEVersion i SpecialId, jak poniżej:

...

	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;

...

Zmienne obszaru gry są definiowane jako UPROPERTY ze specyfikatorem EditDefaultsOnly. Oznacza to, że te zmienne można edytować w edytorze Blueprints, jeśli utworzysz Blueprints przy użyciu TutoProjectCollectable jako klasy nadrzędnej, ale nie pojawią się one w oknach właściwości instancji.

Istnieje inny specyfikator UPROPERTY o nazwie EditInstanceOnly. W tym przypadku zmienna pojawia się w oknie właściwości instancji, ale nie pojawia się w edytorze Blueprint.

Zmienne są pogrupowane w kategorii o nazwie „Obszar gry”. Użycie cudzysłowów jest konieczne ze względu na spację, która istnieje w nazwie kategorii.

Wartości zmiennych obszaru gry są przypisane w pliku TutoProjectCollectable.cpp, wewnątrz konstruktora:

...

// 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;

...

Źródło:https://romeroblueprints.blogspot.com/2020/09/tutoprojectcollectable-class-uproperty.html