UE4 | جرد متعددة اللاعبين # 2 | قم بتوصيل المخطط بـ C ++




Gamemode في مقال سابق ، تحدثت عن كيفية إنشاء DataAsset ، ولماذا هي لطيفة جدًا ومريحة. سنلقي نظرة هنا على كيفية الوصول إلى DataAsset ، وبشكل أكثر دقة البيانات المعينة لها ، من Blueprint و C ++ .


على طول الطريق ، سوف نجيب على سؤال الوصول إلى أي مخطط من C ++ .




مع تفاعل المخططات ، أصبح كل شيء شفافًا جدًا.
نظرًا لأننا قد أغلقنا الوصول المباشر إلى قاعدة البيانات الخاصة بنا ، لا يمكننا الوصول إليها فقط من Blueprint . انتبه للحماية: في الرمز أدناه.


protected: /* This is the main Database for all Items. It contains constant common variables */ UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "ItemsDatabase") TMap<FGameplayTag, FItemsDatabase> ItemsDataBase; 

على سبيل المثال سيكون مستودعنا مرئيًا فقط في الفصول الموروثة ، وهذا أمر جيد ، لأننا كتبنا وظائف لاستدعاء البيانات بأمان.


 /* Used in the widget */ UFUNCTION(BlueprintCallable, Category = "ItemDatabase") FORCEINLINE UTexture2D * GetItemIconTexture(const FGameplayTag & ItemNameTag) const; 

BlueprintCallable يعني فقط أنه يمكن استخدام هذه الوظيفة في Blueprint . إذا قرأت المقالة السابقة ، فربما لاحظت أنه لا توجد وظائف أخرى لاستدعاء هذه السمة. تم ذلك فقط لأن البيانات التي طلبوها ليست مطلوبة حاليًا في Blueprint . إذا كان شخص ما لا يحتاج إلى معرفة شيء ما ، فنحن لسنا في عجلة من أمرنا للإبلاغ عنه.


الخطوة التالية هي إنشاء متغير في أي نوع من أنواع المخططات لقاعدة البيانات التي أنشأناها (في حالتي ، هو BP_DreampaxItemsDataAsset ).


بعد ذلك ، يمكننا بسهولة استخراج النسيج المخصص.




الآن فكر في كيفية الوصول إلى المعلومات في C ++ .
لا يمكننا ببساطة الرجوع إلى فئة DreampaxItemsDataAsset ، لأنها لا تحتوي على أي معلومات. نحن بحاجة للوصول إلى BP_DreampaxItemsDataAsset .


هناك طريقتان رئيسيتان للوصول إلى مخطط .
أولاً ، ضع في اعتبارك طريقة اتصال غير ملائمة باستخدام عكاز ConstructorHelpers. في هذه الحالة ، الوصول إلى الملمس.


 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); } 

تم أخذ المثال من مشروع EpicSurvivalGameSeries الرائع ، وهو مثالي لتعلم تعدد اللاعبين في C ++ . حدد المؤلف هدفًا لإظهار أكبر عدد ممكن من الأساليب والتقنيات لبرمجة لعبة في C ++ .


لماذا هذه الطريقة غير ملائمة؟ نفس المشكلة كما هو الحال مع DataTable - إذا قمت بتغيير اسم أو موقع مخطط ، فلن يتم العثور على الملف.


الأكثر تفضيلاً هي الطريقة التي نعلن بها متغيرًا في ملف الرأس لتخصيصه اللاحق بالفعل في المخطط الموروث. بالنسبة للمثال أعلاه ، قد يبدو مثل هذا:


  UPROPERTY(EditDefaultsOnly, Category = "AimPointer") FCanvasIcon CenterDotIcon; 

أسهل بكثير ، أليس كذلك؟
مهمة الملمس



الآن ، بمعرفة كيفية الوصول إلى أي مخطط ، يمكننا ربط قاعدة بياناتنا بسهولة.


 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; 

انحراف صغير لغير المحترفين حول التصريح عن المتغيرات

كشخص غير مألوف تقريبًا مع C ++ ، كسرت الكثير من النسخ ، محاولًا معرفة كيفية الإعلان عن المتغيرات المخصصة بشكل صحيح.


إذا كان الهدف هو إعلان متغير من الفئة التي أنشأناها ، مثل


 UDreampaxItemsDataAsset * DreampaxItemsDataAsset; //  class UDreampaxItemsDataAsset * DreampaxItemsDataAsset; 

أنا شخصياً لم أفهم لبعض الوقت متى أستخدم الفصل ، ومتى لا.


كل شيء تبين أنه بسيط بشكل مؤلم.


  1. إذا لم تقم بتعيين الفئة ، فأنت بحاجة إلى تضمين #include "Data / DreampaxItemsDataAsset.h" ، الذي يحتوي على إعلان هذه الفئة.
  2. إذا قمت بتعيين الفصل ، فيمكن تضمين # Data / DreampaxItemsDataAsset.h بالفعل في .cpp .
  3. وخيار آخر من الفقرة السابقة ، إذا كنت بحاجة إلى التصريح عن العديد من المتغيرات في هذه الفئة دفعة واحدة. مباشرة بعد كل # تتضمن ، صنفنا المسبق لفئتنا UDreampaxItemsDataAsset ؛ ثم قم بتعريف المتغيرات بدون بادئة الفئة .

أي من هذه الأساليب صحيحة - لا يمكنني الافتراض. إذا شرح شخص ما ، سأكون ممتنا.


نقوم بعمل متغير في فئة C ++ ADreampaxGameMode ، حيث إنه مرئي فقط للخادم ، ويجب أن يمر كل شيء مرتبط بتفرخ الكائن فقط من خلال الخادم. هذه الفئة هي الأصل لـ BP_DreampaxGameMode ، حيث نقوم بتوصيل BP_DreampaxItemsDataAsset .


اتصال BP_DreampaxItemsDataAsset
اتصال BP_DreampaxItemsDataAsset

الآن يمكن استخدام كل قوة C ++ للعمل مع بيانات قاعدة البيانات الخاصة بنا.


في المقالة التالية (أخيرًا!) سنتحدث عن إنشاء المخزون ونكتشف لماذا لا يمكننا الاستغناء عن DataAsset التي تم إنشاؤها بالفعل.


إذا كانت لديك أسئلة أو اقتراحات للكشف عن أي جانب بمزيد من التفصيل ، يرجى الكتابة في التعليقات.

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


All Articles