Makro UPROPERTY()

Makro UPROPERTY()  służy do odsłaniania zmiennych w edytorze Unreal Engine i zawierania właściwości w systemie zarządzania pamięcią Unreal Engine.

Makro UPROPERTY() jest umieszczona na linii powyżej definicji C++ zmiennych, jak przedstawiono w przykładzie poniżej:

UPROPERTY(EditAnywhere, Category = Tutorial)
int32 SpecialId;

Parametry UPROPERTY() nazywane są property specifiers . W powyższym przykładzie użyto EditAnywhere i Category, które służą do grupowania zmiennych w oknie właściwości. Użycie cudzysłowowia w nazwie kategorii jest opcjonalne, ale konieczne, jeśli nazwa kategorii zawiera spację.

Przyjrzyjmy się grupie sześciu specyfikatorów właściwości. Właściwość może używać tylko jednego specyfikatora z tej grupy sześciu wymienionych poniżej. Te sześć specyfikatorów to połączenie dwóch informacji. Pierwsza informacja dotyczy tego, czy właściwość jest tylko do odczytu (Visible), czy można ją edytować (Edit). Druga informacja dotyczy miejsca, w którym pojawia się właściwość, co może występować tylko w instancjach (InstanceOnly), tylko w edytorze Blueprints (DefaultsOnly) lub w obu (Anywhere).

Oto sześć specyfikatorów:

  • VisibleInstanceOnly : tylko do odczytu, pojawia się w oknie właściwości instancji.
  • VisibleDefaultsOnly :  tylko do odczytu, pojawia się w oknie właściwości Blueprints . 
  • VisibleAnywhere : tylko do odczytu, pojawia się w oknie właściwości instancji i w Blueprints.  
  • EditInstanceOnly :  Editable, pojawia się w oknie właściwości instancji. 
  • EditDefaultsOnly :  Editable, pojawia się w oknie właściwości edytora Blueprints. 
  • EditAnywhere :  Editable, pojawia się w oknie właściwości instancji oraz w edytorze Blueprints.

Wskaźniki do komponentów zwykle mają specyfikator VisibleAnywhere. Zapobiega to zmianie wskaźnika, ale właściwości komponentu można modyfikować.

Dwa poniższe specyfikatory wskazują, w jaki sposób właściwość zostanie użyta w wykresie zdarzeń Blueprint. Jeśli żaden specyfikator nie jest obecny, właściwość nie jest wyświetlana do użycia na wykresie zdarzeń.

  • BlueprintReadOnly : można go odczytać, ale nie można go modyfikować na wykresie zdarzeń.
  • BlueprintReadWrite :  można go odczytać i zmodyfikować na wykresie zdarzeń.

Istnieje inny typ specyfikatora zwanymi Metadata . Oto kilka przykładów:

  • DisplayName = “Property Name” :  nazwa, która będzie wyświetlana w oknie właściwości.
  • ClampMin = “N” : Minimalna wartość, jaką można wprowadzić dla właściwości. Może być używany we właściwościach typu integer i float.
  • ClampMax = “N” : Maksymalna wartość, jaką można wprowadzić dla właściwości. Może być używany we właściwościach typu integer i float. 

Aby użyć specyfikatora metadanych, użyj słowa meta  i umieść specyfikatory w nawiasach, jak pokazano poniżej: 

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Tutorial, 
          meta=(DisplayName="Special Identification", ClampMin="0", ClampMax="999") )
int32 SpecialId;

Przykładowe użycie:

Utwórz klasę C ++ o nazwie TestUProperty, używając klasy Actor jako klasy nadrzędnej. W pliku TestUProperty.h dodaj definicję trzech zmiennych, jak pokazano w poniższym kodzie:

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestUProperty.generated.h"

UCLASS()
class TUTOPROJECT_API ATestUProperty : public AActor
{
  GENERATED_BODY()
	
public:	
  // Sets default values for this actor's properties
  ATestUProperty();
	
  UPROPERTY(EditInstanceOnly, Category = Tutorial)
  FString NPCName;
	
  UPROPERTY(VisibleDefaultsOnly, Category = Tutorial)
  float BaseClassVersion;
	
  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Tutorial,
            meta=(DisplayName="Special Identification", ClampMin="0", ClampMax="999") )
  int32 SpecialId;

...

W pliku TestUProperty.cpp przypisz wartość początkową do zmiennej BaseClassVersion w konstruktorze:

#include "TestUProperty.h"

ATestUProperty::ATestUProperty()
{
  // Set this actor to call Tick() every frame.
  PrimaryActorTick.bCanEverTick = true;

  BaseClassVersion = 0.3f;
}

...

Skompiluj kod i dodaj wystąpienie TestUProperty na poziomie. Nie będzie można przenieść instancji na poziom, ponieważ nie zdefiniowaliśmy dla niej RootComponent . Ale możesz wybrać instancję za pomocą narzędzia World Outliner .

Zobacz na karcie Details, że właściwości NPCName i Special Id pojawiają się i można je edytować, ale zmienna BaseClassVersion nie pojawia się, ponieważ specyfikator VisibleDefaultsOnly wskazuje, że powinien pojawić się tylko w Blueprints.

Special Identification to nazwa, która została przypisana do zmiennej SpecialId przy użyciu specyfikatora DisplayName . Specyfikatory ClampMin i ClampMax definiują zakres możliwych wartości dla SpecialId . Jeśli wprowadzisz wartość większą niż 999, edytor automatycznie zmieni się na 999.

Teraz utworzymy Blueprint w oparciu o klasę TestUProperty w języku C ++, aby zobaczyć zmienną BaseClassVersion . Przejdź do klasy C ++ folderu za pomocą Content Browser i kliknij prawym przyciskiem na TestUProperty klasie . Wybierz opcję Utwórz klasę Blueprint na podstawie TestUProperty (Create Blueprint class based on TestUProperty).

Teraz utworzymy Blueprint w oparciu o klasę TestUProperty C ++, aby zobaczyć zmienną BaseClassVersion . Przejdź do folderu C ++ klasy przy użyciu edytora w Content Browser i kliknij prawym przyciskiem myszy na TestUProperty klasie. Wybierz opcję Utwórz klasę Blueprint na podstawie TestUProperty. (Create Blueprint class based on TestUProperty).

Otwórz nowy Blueprint i kliknij przycisk Class Defaults. Zwróć uwagę, że zmienna BaseClassVersion pojawia się, ale nie można jej edytować, a zmienna NPCName nie pojawia się, ponieważ powinna pojawiać się tylko w instancjach.

Kliknij prawym przyciskiem myszy Blueprint EventGraph i wyszukaj, używając słowa „specjalne”. Zwróć uwagę, że pojawiają się funkcje Get i Set dla zmiennej SpecialId . Wynika to ze specyfikatora BlueprintReadWrite . Pozostałe dwie zmienne nie pojawiają się na liście Actions.

Lista Akcje planu wykorzystywała nazwę, która była w specyfikatorze DisplayName zmiennej SpecialId, ale węzły Blueprint używały nazwy zmiennej, takiej jak w kodzie. 


Źródło:https://romeroblueprints.blogspot.com/2020/10/the-uproperty-macro.html