UE4 | Inventaire pour multijoueur # 2 | Connectez Blueprint Ă  C ++




Mode de jeu 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: /* This is the main Database for all Items. It contains constant common variables */ 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é.


 /* Used in the widget */ 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) { /* You can use the FObjectFinder in C++ to reference content directly in code. Although it's advisable to avoid this and instead assign content through Blueprint child classes. */ 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?
Affectation des textures



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); ///////////////////////////////////////////////////////////////////////////// //Data Bases ///////////////////////////////////////////////////////////////////////////// public: /* Connect data base in BP for items*/ UPROPERTY(EditDefaultsOnly, Category = "Database") class UDreampaxItemsDataAsset * DreampaxItemsDataAsset; FORCEINLINE UDreampaxItemsDataAsset * GetDreampaxItemsDataAsset() const; 

Une petite digression pour les non-pros sur la déclaration des variables

En 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; //  class 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.


  1. Si vous ne définissez pas la classe , vous devez inclure #include "Data / DreampaxItemsDataAsset.h" , contenant la déclaration de cette classe.
  2. Si vous dĂ©finissez la classe , #include "Data / DreampaxItemsDataAsset.h" peut dĂ©jĂ  ĂȘtre fait dans .cpp .
  3. 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
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.

Source: https://habr.com/ru/post/fr418951/


All Articles