Klasa TutoProjectHUD – używanie pointerów C++

W tym artykule zamierzam stworzyć klasę TutoProjectHUD odpowiedzialną za renderowanie na ekranie zmiennych stanu gry. Jak widzimy te zmienne należą do klasy TutoProjectGameMode. Będziemy musieli użyć wskaźnika, aby uzyskać dostęp do publicznych zmiennych i funkcji klasy TutoProjectGameMode w klasie TutoProjectHUD.

Najpierw utwórzmy klasę TutoProjectHUD. W Content Browser przejdź do folderu TutoProject, który znajduje się w folderze C++ Classes. Kliknij prawym przyciskiem myszy wolne miejsce w Content Browser i wybierz opcję New C+ Class…

W następnym oknie musisz wybrać klasę parent, która będzie używana jako typ dla nowej klasy. Przewiń opcje, aż znajdziesz klasę HUD. Wybierz klasę HUD i kliknij przycisk Dalej.

W polu Name wpisz TutoProjectHUD. W polu Path zachowaj domyślną lokalizację foldera projektu. Następnie kliknij przycisk Create Class.

W tym artykule skupimy się tylko na tym, jak utworzyć wskaźnik do klasy TutoProjectGameMode i jak uzyskać odniesienie do trybu gry używanego przez grę. W innym artykule zobaczymy funkcje używane do renderowania treści na ekranie.

Pointer przechowuje adres pamięci. Możemy użyć wskaźnika, aby odwołać się do instancji klasy. Definiujesz, że zmienna jest wskaźnikiem, używając operatora * obok typu zmiennej. Poniższy wiersz kodu przedstawia definicję zmiennej o nazwie TutoProjectGameMode, która jest wskaźnikiem do instancji klasy ATutoProjectGameMode.

ATutoProjectGameMode* TutoProjectGameMode;

Powyższa linia definiuje wskaźnik, ale nie przechowuje jeszcze odwołania do instancji klasy ATutoProjectGameMode. W funkcji BeginPlay() otrzymamy referencję do instancji klasy ATutoProjectGameMode używanej przez grę i zapiszemy ją w naszym wskaźniku.

Otwórz plik TutoProjectHUD.h, dodaj etykietę protected: oraz deklaracje wskaźnika TutoProjectGameMode i funkcji BeginPlay(), jak pokazano w kodzie poniżej.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/HUD.h"
#include "TutoProjectHUD.generated.h"

UCLASS()
class TUTOPROJECT_API ATutoProjectHUD : public AHUD
{
	GENERATED_BODY()

protected:

	class ATutoProjectGameMode* TutoProjectGameMode;

	virtual void BeginPlay() override;
		
};

Zauważ, że istnieje słowo kluczowe class przed definicją wskaźnika TutoProjectGameMode. Było to konieczne, ponieważ klasa ATutoProjectHUD nie zna klasy ATutoProjectGameMode. Jest to sposób na poinformowanie kompilatora, że istnieje klasa o nazwie ATutoProjectGameMode i że definicja klasy zostanie znaleziona później podczas kompilacji. Jest to również znane jako Forward Declaration.

Zamiast używać słowa kluczowego class, możesz dodać #include „TutoProjectGameMode.h” na początku, ponieważ ten plik nagłówkowy zawiera definicję klasy ATutoProjectGameMode. Jeśli to możliwe, unikaj dodawania więcej #include w plikach nagłówkowych .h. Najlepiej umieścić je w plikach wdrożeniowych, czyli w .cpp.

Plik TutoProjectHUD.cpp musi mieć następującą zawartość:

#include "TutoProjectHUD.h"
#include "TutoProjectGameMode.h"

void ATutoProjectHUD::BeginPlay()
{
  Super::BeginPlay();

  TutoProjectGameMode = GetWorld()->GetAuthGameMode<ATutoProjectGameMode>();
}

Przeanalizujmy linię odpowiedzialną za uzyskanie i przechowywanie odniesienia do trybu gry w naszym wskaźniku:

  • TutoProjectGameMode: To jest nasza zmienna wskaźnikowa.
  • GetWorld(): ta funkcja zwraca wskaźnik do wystąpienia klasy UWorld, która reprezentuje bieżącą mapę.
  • ->: Gdy masz wskaźnik, musisz użyć operatora ->, aby uzyskać dostęp do funkcji i zmiennych instancji.
  • GetAuthGameMode(): Ta funkcja zwraca wskaźnik do instancji trybu gry używanej przez mapę. Funkcja używa template parameter C ++, który jest klasą przekazywaną między <>.

Funkcja GetAuthGameMode podejmie próbę przesłania trybu gry do klasy ATutoProjectGameMode. Cast to konwersja typu. Ta konwersja będzie działać tylko wtedy, gdy mapa używa trybu gry TutoProjectGameMode (game mode wybierany w World Settings). Jeśli nie znasz trybu gry w Unreal Engine, sprawdź mój inny artykuł.

Następny obraz pokazuje, jak wyglądałaby funkcja / zdarzenie BeginPlay(), gdyby zostało to zrobione w Blueprints.

W celach dydaktycznych nazwę klasy używaną w węźle Cast umieściłem jako ATutoProjectGameMode, aby ułatwić skojarzenie z kodem C++. Ale pamiętaj, że przedrostek A jest konwencją Unreal Engine, która istnieje tylko w kodzie C++.

Nie zapomnij umieścić linii #include „TutoProjectGameMode.h” na początku pliku TutoProjectHUD.cpp, w przeciwnym razie podczas kompilacji pojawi się następujący błąd:

error C2027: use of undefined type 'ATutoProjectGameMode'
pointer to incomplete class type is not allowed

Jeśli pojawi się błąd tego typu związany z jakąkolwiek klasą Unreal Engine, przejdź do Unreal Engine API Reference i wyszukaj klasę. Dokumentacja pokazuje, jak dołączyć plik nagłówkowy klasy. Jako przykład, poniższy obrazek przedstawia kilka informacji o klasie UCanvas.


Źródło:https://romeroblueprints.blogspot.com/2020/08/tutoprojecthud-class-using-c-pointers.html