Makro UClass()

Makro UClass() służy do wskazania klasy C++ i sprawdzenie czy jest częścią systemu Unreal’s Reflection. Jest to konieczne, aby klasa C ++ została rozpoznana przez edytor Unreal Engine. Kolejną zaletą korzystania z UClass() jest to, że można używać systemu zarządzania pamięcią Unreal Engine w klasie C++.

Kompilacja projektu Unreal C++ przebiega w dwóch fazach. W pierwszej fazie UnrealHeaderTool (UHT) odczytuje pliki nagłówkowe C++ w poszukiwaniu makr Unreal generuje niezbędny kod, który zastąpi te makra. W drugiej fazie kompilator C++ kompiluje wynikowy kod.

Makro UClass() jest umieszczane w wierszu powyżej definicji klasy C++. Poniższy kod to początek pliku TutoProjectCollectable.h, który został utworzony w części I.

#pragma once

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

UCLASS()
class TUTOPROJECT_API ATutoProjectCollectable : public AActor
{
	GENERATED_BODY()

... 

Dla tej klasy UnrealHeaderTool wygeneruje kod, który zostanie umieszczony w pliku TutoProjectCollectable.generated.h oraz kod, który zastąpi makro GENERATED_BODY().

Przykładem kodu wygenerowanego przez UnrealHeaderTool jest funkcja StaticClass(), która służy do zwracania wskaźnika do klasy UClass reprezentującej klasę C++. Ta funkcja jest statyczna, co oznacza, że nie potrzebujesz instancji, aby ją wywołać, wystarczy użyć nazwy klasy.

Używamy funkcji StaticClass() w klasie ATutoProjectGameMode do zdefiniowania klasy HUD używanej przez Game Mode:

HUDClass = ATutoProjectHUD::StaticClass();

Makro UClass () ma parametry znane jako specyfikatory klas, które definiują zachowanie klasy. Dwa najczęstsze to:

  • Blueprintable: wskazuje, że Blueprints można tworzyć przy użyciu klasy C++ jako klasy nadrzędnej.
  • BlueprintType: wskazuje, że klasa C ++ może być używana jako typ zmiennej w Blueprints.

Specyfikator Blueprintable jest dziedziczony przez podklasy. Na przykład klasa AActor ma ten specyfikator, więc jeśli utworzysz klasę C ++ przy użyciu klasy AActor jako klasy nadrzędnej, nie musisz umieszczać Blueprintable w nowej klasie.

Istnieje również specyfikator NotBlueprintable. Możesz go użyć, jeśli tworzysz podklasę AActor, ale nie chcesz zezwalać na tworzenie Blueprints w oparciu o Twoją klasę C++.

Przykładowe użycie:

Utwórz klasę C++ o nazwie TestUClass, używając klasy Object jako klasy nadrzędnej. Klasa Object jest klasą bazową dla obiektów Unreal Engine. Konieczne jest zaznaczenie opcji “Show All Classes“, aby klasa Object została wyświetlona jak na poniższym zrzucie ekranu.

W pliku TestUClass.h dodaj specyfikatory Blueprintable i BlueprintType w nawiasach UClass(), jak w poniższym kodzie:

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "TestUClass.generated.h"

UCLASS(Blueprintable, BlueprintType)
class TUTOPROJECT_API UTestUClass : public UObject
{
	GENERATED_BODY()
	
};

Skompiluj kod. Przejdź do nowego folderu klasy C++ za pomocą Content Browser oraz kliknij prawym przyciskiem myszy na klasę. Sprawdź, czy opcja Create Blueprint Class na podstawie TestUClass jest włączona (class based on) jak na poniższym zrzucie. Gdyby w naszym przykładzie nie było możliwości wykonania BlueprintType, ta opcja zostałaby wyłączona.

Utwórz nową zmienną w Blueprint. Kliknij Variable Type, aby wybrać typ. Użyj pola wyszukiwania, aby przefiltrować typy i zobaczyć, czy klasa TestUClass jest dostępna do użycia jako konkretny rodzaj. Gdyby nie miał BlueprintType w tej klasie, nie zostałby wyświetlony.


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