Klasa UObject
UObject klasa jest klasą bazową dla wszystkich obiektów Unreal Engine. Zapewnia zestaw ważnych usług, takich jak odbicie, serializacja, obsługa sieci i zarządzanie pamięcią.
Instancji UObject nie można dodać do poziomu. Muszą być częścią aktora. Jeśli chcesz utworzyć klasę, której instancję można utworzyć na poziomie, musi ona dziedziczyć po AActor .
Klas, które dziedziczą z UObject ale nie dziedziczą z AActor mają prefiks U . Jako przykład mamy klasę UActorComponent, która reprezentuje komponenty dodane w Actor.
Aby utworzyć instancję podklasy UObject , użyj funkcji NewObject(). Poniższy wiersz przedstawia przykład, przy założeniu, że klasa UObjectChild jest podklasą klasy UObject :
UObjectChild* ObjectChild = NewObject<UObjectChild>(this,UObjectChild::StaticClass());
Unreal Engine zarządza pamięcią tego obiektu i niszczy go, gdy nie jest już potrzebny. Ale jeśli chcesz zniszczyć instancję UObject , możesz użyć funkcji ConditionalBeginDestroy () i przypisać nullptr do wskaźnika:
ObjectChild->ConditionalBeginDestroy();
ObjectChild = nullptr;
Przykładowe użycie:
Utwórz klasę C ++ o nazwie RpgDiceSet, używając klasy Object jako klasy nadrzędnej. Konieczne jest zaznaczenie opcji Pokaż wszystkie klasy , aby klasa Object była wyświetlana tak, jak pokazano na obrazku.

RpgDiceSet klasa będzie stanowić zbiór pięciu kości. Posiada funkcję RollDice () do rzucania kośćmi i funkcję ResultString (), która zwraca wynik kości.
W pliku RpgDiceSet.h dodaj następujący kod:
...
UCLASS()
class TUTOPROJECT_API URpgDiceSet : public UObject
{
GENERATED_BODY()
//For simplicity, the variables are public.
public:
// Note for non-native English readers:
// Die is the singular of Dice.
int32 Die1;
int32 Die2;
int32 Die3;
int32 Die4;
int32 Die5;
void RollDice(int32 NumFaces);
FString ResultString();
};
W pliku RpgDiceSet.cpp dodaj implementację dwóch funkcji pokazanych poniżej:
#include "RpgDiceSet.h"
void URpgDiceSet::RollDice(int32 NumFaces)
{
if(NumFaces >= 2 && NumFaces <= 20)
{
Die1 = FMath::RandRange(1, NumFaces);
Die2 = FMath::RandRange(1, NumFaces);
Die3 = FMath::RandRange(1, NumFaces);
Die4 = FMath::RandRange(1, NumFaces);
Die5 = FMath::RandRange(1, NumFaces);
}
else
{
Die1 = 0;
Die2 = 0;
Die3 = 0;
Die4 = 0;
Die5 = 0;
}
}
FString URpgDiceSet::ResultString()
{
FString Result = FString::Printf(
TEXT("Die 1: %d; Die 2: %d; Die 3: %d; Die 4: %d; Die 5: %d;"),
Die1, Die2, Die3, Die4, Die5);
return Result;
}
Funkcja RollDice () ma parametr NumFaces , który wskazuje liczbę ścianek kości. Należy przekazać liczbę całkowitą od 2 do 20 . Funkcja FMath :: RandRange (int32 Min, int32 Max) zwraca losową wartość całkowitą > = Min i <= Max .
Funkcja ResultString() zwraca FString zawierający wyniki wszystkich kości.
Teraz utwórz klasę C ++ o nazwie TestUObject, używając klasy Actor jako klasy nadrzędnej. W pliku TestUObject.cpp dodaj #include „RpgDiceSet.h” i zaimplementuj funkcję BeginPlay() w następujący sposób:
#include "TestUObject.h"
#include "RpgDiceSet.h"
void ATestUObject::BeginPlay()
{
Super::BeginPlay();
URpgDiceSet* RpgDiceSet = NewObject<URpgDiceSet>(this, URpgDiceSet::StaticClass());
RpgDiceSet->RollDice(20);
if(GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red,
RpgDiceSet->ResultString() );
}
RpgDiceSet->ConditionalBeginDestroy();
RpgDiceSet = nullptr;
}
...
Funkcja BeginPlay() tworzy instancję klasy URpgDiceSet, wywołuje jej funkcje, wyświetla wynik na ekranie, a następnie rozpoczyna niszczenie utworzonej instancji.
Skompiluj kod C ++ i dodaj wystąpienie TestUObject na poziomie. Uruchom grę i zobacz wyniki kostek wyświetlane na ekranie. Poniższy obraz przedstawia jedną z realizacji:

Źródło:https://romeroblueprints.blogspot.com/2020/11/the-uobject-class.html