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