Dans un article précédent, j'ai expliqué comment créer un DataAsset et pourquoi il est si agréable et pratique. Ici, nous verrons comment accéder au DataAsset , plus précisément aux données qui lui sont attribuées, à partir de Blueprint et C ++ .
En cours de route, nous répondrons à la question de l'accÚs à n'importe quel Blueprint depuis C ++ .
Avec l'interaction Blueprints , tout est assez transparent.
Ătant donnĂ© que nous avons fermĂ© l'accĂšs direct Ă notre base de donnĂ©es, nous ne pouvons pas simplement y accĂ©der Ă partir de Blueprint . Faites attention aux protĂ©gĂ©s: dans le code ci-dessous.
protected: UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "ItemsDatabase") TMap<FGameplayTag, FItemsDatabase> ItemsDataBase;
C'est-à -dire notre référentiel ne sera visible que dans les classes héritées, ce qui est bien, car nous avons des fonctions écrites pour appeler des données en toute sécurité.
UFUNCTION(BlueprintCallable, Category = "ItemDatabase") FORCEINLINE UTexture2D * GetItemIconTexture(const FGameplayTag & ItemNameTag) const;
BlueprintCallable signifie simplement que cette fonction peut ĂȘtre utilisĂ©e dans Blueprint . Si vous avez lu l' article prĂ©cĂ©dent , vous avez probablement remarquĂ© que d'autres fonctions d'appel de cet attribut ne sont pas disponibles. Cela a Ă©tĂ© fait uniquement parce que les donnĂ©es qu'ils ont appelĂ©es n'Ă©taient actuellement pas nĂ©cessaires dans Blueprint . Si quelqu'un n'a pas besoin de savoir quelque chose, nous ne sommes pas pressĂ©s de le signaler.
L'étape suivante consiste à créer une variable dans n'importe quel type Blueprint de la base de données que nous avons créée (dans mon cas, c'est BP_DreampaxItemsDataAsset ).
AprÚs cela, nous extrayons facilement et facilement la texture attribuée.
Considérez maintenant comment accéder aux informations en C ++ .
Nous ne pouvons pas simplement nous référer à la classe DreampaxItemsDataAsset , car elle ne contient aucune information. Nous devons avoir accÚs à BP_DreampaxItemsDataAsset .
Il existe deux méthodes principales pour accéder à Blueprint .
Tout d'abord, envisagez une méthode de connexion peu pratique à l'aide de la béquille ConstructorHelpers. Dans ce cas, accédez à la texture.
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); }
L'exemple est tiré du merveilleux projet EpicSurvivalGameSeries , parfait pour apprendre le multijoueur en C ++ . L'auteur s'est fixé pour objectif de montrer autant de méthodes et techniques de programmation d'un jeu en C ++ que possible.
Pourquoi cette mĂ©thode n'est-elle pas pratique? Le mĂȘme problĂšme qu'avec DataTable - si vous modifiez le nom ou l'emplacement du Blueprint , le fichier ne sera pas trouvĂ©.
La plus prĂ©fĂ©rable est la mĂ©thode dans laquelle nous dĂ©clarons une variable dans le fichier d'en-tĂȘte pour son affectation ultĂ©rieure dĂ©jĂ dans le Blueprint hĂ©ritĂ©. Pour l'exemple ci-dessus, cela pourrait ressembler Ă ceci:
UPROPERTY(EditDefaultsOnly, Category = "AimPointer") FCanvasIcon CenterDotIcon;
Beaucoup plus facile, non?
Maintenant, sachant comment accéder à n'importe quel Blueprint , nous pouvons facilement connecter notre base de données.
UCLASS() class ADreampaxGameMode : public AGameMode { GENERATED_BODY() public: ADreampaxGameMode(const FObjectInitializer & ObjectInitializer);
Une petite digression pour les non-pros sur la déclaration des variablesEn tant que personne peu familiÚre avec C ++ , j'ai cassé beaucoup de copies, essayant de comprendre comment déclarer correctement les variables personnalisées .
Si le but est de déclarer une variable de la classe que nous avons créée, telle que
UDreampaxItemsDataAsset * DreampaxItemsDataAsset;
Personnellement, je ne comprenais pas depuis un certain temps quand utiliser la classe et quand non.
Tout s'est avéré douloureusement simple.
- Si vous ne définissez pas la classe , vous devez inclure #include "Data / DreampaxItemsDataAsset.h" , contenant la déclaration de cette classe.
- Si vous dĂ©finissez la classe , #include "Data / DreampaxItemsDataAsset.h" peut dĂ©jĂ ĂȘtre fait dans .cpp .
- Et encore une option du paragraphe précédent, si vous devez déclarer plusieurs variables de cette classe à la fois. Immédiatement aprÚs tout #include, pré-déclarer notre classe class UDreampaxItemsDataAsset; , puis déclarez les variables sans le préfixe de classe .
Laquelle de ces méthodes est correcte - je ne peux pas prétendre le dire. Si quelqu'un explique, je vous en serai reconnaissant.
Nous crĂ©ons une variable dans la classe C ++ ADreampaxGameMode , car elle n'est visible que par le serveur, et tout ce qui est liĂ© Ă la gĂ©nĂ©ration d' objet ne doit passer que par le serveur. Cette classe est le parent de BP_DreampaxGameMode , oĂč nous connectons notre BP_DreampaxItemsDataAsset .
Connexion BP_DreampaxItemsDataAsset DĂ©sormais, toute la puissance du C ++ peut ĂȘtre utilisĂ©e pour travailler avec les donnĂ©es de notre base de donnĂ©es.
Dans le prochain article (enfin!) Nous parlerons de la création d'inventaire et découvrirons pourquoi nous ne pouvons pas nous passer du DataAsset déjà créé.
Si vous avez des questions ou des suggestions pour divulguer un aspect plus en détail, veuillez écrire dans les commentaires.