In einem früheren Artikel habe ich darüber gesprochen, wie ein DataAsset erstellt wird und warum es so schön und praktisch ist. Hier sehen wir uns an, wie Sie über Blueprint und C ++ auf das DataAsset zugreifen können , genauer gesagt auf die ihm zugewiesenen Daten.
Unterwegs werden wir die Frage nach dem Zugriff auf Blueprint von C ++ aus beantworten.
Mit der Blueprints- Interaktion ist alles ziemlich transparent.
Aufgrund der Tatsache, dass wir den direkten Zugriff auf unsere Datenbank geschlossen haben, können wir nicht einfach über Blueprint darauf zugreifen. Achten Sie auf geschützt: im Code unten.
protected: UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "ItemsDatabase") TMap<FGameplayTag, FItemsDatabase> ItemsDataBase;
Das heißt, Unser Repository ist nur in geerbten Klassen sichtbar. Dies ist gut, da wir Funktionen zum sicheren Aufrufen von Daten geschrieben haben.
UFUNCTION(BlueprintCallable, Category = "ItemDatabase") FORCEINLINE UTexture2D * GetItemIconTexture(const FGameplayTag & ItemNameTag) const;
BlueprintCallable bedeutet nur, dass diese Funktion in Blueprint verwendet werden kann . Wenn Sie den vorherigen Artikel gelesen haben, haben Sie wahrscheinlich bemerkt, dass andere Funktionen zum Aufrufen dieses Attributs nicht vorhanden sind. Dies geschah nur, weil die von ihnen aufgerufenen Daten derzeit in Blueprint nicht benötigt wurden. Wenn jemand etwas nicht wissen muss, haben wir es nicht eilig, es zu melden.
Der nächste Schritt besteht darin, eine Variable in einem beliebigen Blueprint- Typ der von uns erstellten Datenbank zu erstellen (in meinem Fall BP_DreampaxItemsDataAsset ).
Danach können wir die zugewiesene Textur leicht extrahieren.
Überlegen Sie nun, wie Sie auf Informationen in C ++ zugreifen können.
Wir können nicht einfach auf die DreampaxItemsDataAsset- Klasse verweisen, da sie keine Informationen enthält. Wir müssen Zugriff auf BP_DreampaxItemsDataAsset erhalten .
Es gibt zwei Hauptmethoden, um zu Blueprint zu gelangen.
Betrachten Sie zunächst eine unbequeme Verbindungsmethode mit der ConstructorHelpers-Krücke. In diesem Fall Zugriff auf die Textur.
ASHUD::ASHUD(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { static ConstructorHelpers::FObjectFinder<UTexture2D> HUDCenterDotObj(TEXT("/Game/UI/HUD/T_CenterDot_M.T_CenterDot_M")); CenterDotIcon = UCanvas::MakeIcon(HUDCenterDotObj.Object); }
Das Beispiel stammt aus dem wunderbaren EpicSurvivalGameSeries- Projekt, das sich perfekt zum Erlernen des Multiplayer- Modus in C ++ eignet . Der Autor hat sich zum Ziel gesetzt, möglichst viele Methoden und Techniken zum Programmieren eines Spiels in C ++ aufzuzeigen.
Warum ist diese Methode unpraktisch? Das gleiche Problem wie bei DataTable : Wenn Sie den Blueprint- Namen oder den Speicherort ändern, wird die Datei nicht gefunden.
Am besten ist die Methode, mit der wir eine Variable in der Header-Datei für ihre nachfolgende Zuweisung deklarieren, die bereits im geerbten Blueprint enthalten ist . Im obigen Beispiel könnte es so aussehen:
UPROPERTY(EditDefaultsOnly, Category = "AimPointer") FCanvasIcon CenterDotIcon;
Jetzt wissen wir, wie wir auf einen Blueprint zugreifen können, und können unsere Datenbank problemlos verbinden.
UCLASS() class ADreampaxGameMode : public AGameMode { GENERATED_BODY() public: ADreampaxGameMode(const FObjectInitializer & ObjectInitializer);
Ein kleiner Exkurs für Nicht-Profis über das Deklarieren von VariablenAls eine Person, die mit C ++ fast nicht vertraut ist, habe ich viele Kopien gebrochen und versucht herauszufinden, wie man benutzerdefinierte Variablen korrekt deklariert.
Wenn das Ziel darin besteht, eine Variable der von uns erstellten Klasse zu deklarieren, z
UDreampaxItemsDataAsset * DreampaxItemsDataAsset;
Ich persönlich habe einige Zeit nicht verstanden, wann ich die Klasse benutzen sollte und wann nicht.
Alles erwies sich als schmerzlich einfach.
- Wenn Sie die Klasse nicht festlegen, müssen Sie #include "Data / DreampaxItemsDataAsset.h" einschließen , das die Deklaration dieser Klasse enthält.
- Wenn Sie die Klasse festlegen, kann #include "Data / DreampaxItemsDataAsset.h" bereits in .cpp ausgeführt werden .
- Und noch eine Option des vorherigen Absatzes, wenn Sie viele Variablen dieser Klasse gleichzeitig deklarieren müssen. Deklarieren Sie sofort nach #include unsere Klassenklasse UDreampaxItemsDataAsset; und deklarieren Sie dann die Variablen ohne das Klassenpräfix .
Welche dieser Methoden richtig ist, kann ich nicht sagen. Wenn jemand erklärt, werde ich dankbar sein.
Wir machen eine Variable in der C ++ - Klasse ADreampaxGameMode , da sie nur für den Server sichtbar ist und alles, was mit dem Objekt- Spawn verbunden ist, nur über den Server gehen sollte. Diese Klasse ist das übergeordnete Element für BP_DreampaxGameMode , in das wir unser BP_DreampaxItemsDataAsset einfügen .
BP_DreampaxItemsDataAsset-Verbindung Jetzt kann die gesamte Leistung von C ++ genutzt werden, um mit den Daten unserer Datenbank zu arbeiten.
Im nächsten Artikel (endlich!) Werden wir über das Erstellen von Inventar sprechen und herausfinden, warum wir nicht auf das bereits erstellte DataAsset verzichten können .
Wenn Sie Fragen oder Anregungen haben, um einen Aspekt detaillierter offenzulegen, schreiben Sie bitte in die Kommentare.