AchievementSystem 2.0

نظام إنجازات معياري ومرن لـ Unreal Engine. نواة نظيفة لإدارة الإنجازات 

والتصنيفات، دون فرض أي واجهة مستخدم أو منطق حفظ.


مقدمة

يوفّر AchievementSystem نواة نظيفة لإدارة الإنجازات والتصنيفات. لا يفرض أي واجهة مستخدم أو منطق حفظ، فتبقى لك السيطرة الكاملة. تُحمَّل جميع البيانات من جداول البيانات (Data Tables)، مما يتيح التوطين والتوسّع بكفاءة.

مبني على جداول البياناتالأسماء والأوصاف والأيقونات موجودة في جداول البيانات، وجاهزة للتوطين.
تصنيفات من مستويينتحتوي التصنيفات الرئيسية على تصنيفات، وتحتوي التصنيفات على الإنجازات.
تتبّع التقدّملكل إنجاز تقدّم حالي وحدّ أقصى للتقدّم، مع إكمال تلقائي.
بيانات جاهزة للواجهةدوال للقراءة فقط ببيانات منظّمة، يمكن ربطها مباشرة بعناصر الواجهة (Widgets).
يدعم اللعب الجماعيمراجع نظام خاصة بكل لاعب للألعاب عبر الإنترنت والألعاب متعددة الملفات الشخصية.
ماكروهات إضافيةيتضمن For Each With Delay وGet All Data Table Items.

كيف يعمل النظام

يعتمد النظام على تدفّق بيانات بسيط.

  1. التعريف
    تُعرَّف الإنجازات والتصنيفات في جداول البيانات وتُحمَّل مسبقًا أثناء التشغيل.
  2. الحفظ والتحميل
    أنت من يتحكم في كيفية حفظ الإنجازات وتحميلها، ثم تُعلِم النظام بالإنجازات التي سبق فتحها.
  3. الاستخدام
    بعد التحميل، ينظّم النظام الإنجازات حسب التصنيف ويوفّر بيانات منظّمة يمكنك استخدامها مباشرة في الواجهة أو في منطق اللعب.

البدء

  1. أنشئ Blueprint فرعيًا
    افتح BP_AchievementsSystem وأنشئ Child Blueprint Class. سيكون هذا الـ Blueprint الفرعي نسخة نظام الإنجازات الرئيسية لديك.
  2. أنشئ هيكل بيانات (Structure)
    أنشئ Structure يحتوي على بيانات الإنجاز. يجب أن يتضمن ID (عدد صحيح) وMax Progress (عدد صحيح).
  3. أنشئ جدول بيانات (Data Table)
    أنشئ Data Table واربطه بالـ Structure الذي أنشأته. املأه ببيانات الإنجازات (الأسماء، الأوصاف، الأيقونات، إلخ).
  4. افتح Event Graph
    افتح BP_Achievements_Child وانتقل إلى Event Graph.
  5. أضف Preload Achievement Data
    أضف الدالة Preload Achievement Data. تتطلب ثلاث قيم (انظر الجدول أدناه).
  6. اربط القيم
    اربط جميع القيم المطلوبة لكل إنجاز تريد تحميله مسبقًا.
المُدخَلالوصف
IDالمعرّف الفريد للإنجاز.
Max Progressالحد الأقصى لقيمة التقدّم المطلوبة لإكمال الإنجاز.
Row Nameاسم الصف الخاص بالإنجاز في جدول البيانات.
تحتاج إلى مثال؟ راجع النسخة التجريبية AchievementStyle_01.

نظرة عامة على التصنيفات

نظام التصنيفات عبارة عن شجرة بسيطة بمستويين فقط: التصنيفات الرئيسية (Top Level Categories) وتصنيفات الإنجازات (Achievement Categories). هذا يجعل النظام سهل الفهم وفعّالًا.

تصنيف رئيسي 01
├─ تصنيف 01
│   ├─ إنجاز
│   └─ إنجاز
└─ تصنيف 02
    ├─ إنجاز
    └─ إنجاز

التحميل المسبق لتصنيفات الإنجازات

لتحديد الإنجازات التي تنتمي إلى تصنيف ما، استخدم Preload Achievement Category. تعمل بالطريقة نفسها المستخدمة في التحميل المسبق للإنجازات.

المُدخَلالوصف
Category IDمعرّف فريد للتصنيف.
Achievement IDs (Array)جميع معرّفات الإنجازات التي تنتمي إلى هذا التصنيف.
Row Nameاسم صف التصنيف في جدول بيانات التصنيفات.

التحميل المسبق للتصنيفات الرئيسية

تجمع التصنيفات الرئيسية عدة تصنيفات معًا. استخدم Preload Top Level Category.

المُدخَلالوصف
Category IDمعرّف فريد للتصنيف الرئيسي.
Category IDs (Array)جميع معرّفات التصنيفات التي تنتمي إلى هذا التصنيف الرئيسي.
Row Nameاسم صف التصنيف الرئيسي في جدول البيانات.

مثال بسيط

التقدّم (تصنيف رئيسي 01)
├─ القصة (تصنيف 01)
│   ├─ الخطوة الأولى
│   └─ بداية جديدة
└─ الاستكشاف (تصنيف 02)
    ├─ أول اكتشاف
    └─ خبير الاستكشاف

المهارات (تصنيف رئيسي 02)
├─ مهارات عامة (تصنيف 01)
│   └─ تنفيذ مثالي
└─ الدقّة (تصنيف 02)
    ├─ ضربة واحدة مذهلة
    └─ ثبات اليد

مرجع الدوال

ملاحظة: هذه الدوال للقراءة فقط ولا تعدّل أي بيانات (باستثناء Achievement Trigger).

الإنجازات المكتملة (Complete Achievements)

تُرجع الدوال الثلاث أدناه البنية (struct) نفسها:

الدالةالمُدخَلالوصف
Get All Completed Achievementsلا يوجدالتقدّم الكلي لجميع الإنجازات في النظام. استخدمها للإحصاءات أو الواجهة أو ملاحظات اللاعب.
Get All Completed Achievements By CategoryCategory IDالتقدّم داخل تصنيف محدد. استخدمها لعرض تقدّم التصنيف في الواجهة أو للتحقق مما إذا كان التصنيف مكتملًا بالكامل.
Get Completed Achievements In Top Level CategoryCategory ID (تصنيف رئيسي)التقدّم داخل تصنيف رئيسي، بما في ذلك جميع تصنيفاته الفرعية. استخدمها لعرض تقدّم مجموعة من التصنيفات.

التحميل (Load)

تُرجع دوال تحميل الإنجازات مصفوفة من البنى (structs) تحتوي على: Row Name، Complete Date (String)، Progress (Int)، Max Progress (Int) وIs Completed (Bool).

الدالةالمُدخَلالمُخرَج / الاستخدام
Load Achievements By CategoryCategory IDجميع الإنجازات في تصنيف ما. استخدمها لملء الواجهة بإنجازات تصنيف واحد.
Load All Achievementsلا يوجدكل الإنجازات دفعة واحدة. استخدمها للإحصاءات العامة أو ملخصات نهاية اللعبة.
Load All Categoriesلا يوجدمصفوفة من البنى (structs) تحتوي على ID وRow. استخدمها لملء قوائم التصنيفات أو لتنفيذ عمليات على مستوى التصنيف.
Load Child CategoriesCategory ID (التصنيف الأب / الرئيسي)ID وRow لكل تصنيف فرعي. استخدمها لعرض التصنيفات الفرعية داخل تصنيف رئيسي.
Load Top Level Categoriesلا يوجدمصفوفة من البنى (structs) تحتوي على Row وCategory ID وCategory IDs (مصفوفة التصنيفات الفرعية). استخدمها لعرض جميع التصنيفات الرئيسية مع تصنيفاتها الفرعية.

الحالات (States)

الدوال الثلاث كلها دوال نقية (Pure Functions).

الدالةالمُدخَلالمُخرَجحالة الاستخدام
Get ProgressAchievement ID (Int)Progress (Int)، Max Progress (Int)عرض أو فحص تقدّم إنجاز واحد.
Get Row NameAchievement ID (Int)Row Name (Name)استرجاع البيانات المترجمة (الاسم، الوصف، الأيقونة) الخاصة بإنجاز ما.
Is Completed ?Achievement ID (Int)Return Value (Bool)التحقق من حالة إكمال الإنجاز لمنطق اللعب أو لتحديث الواجهة.

Achievement Trigger

تُفعّل تقدّم إنجاز محدد وتحدّثه للاعب معيّن.

المُدخَلالوصف
Achievement ID (Int)معرّف الإنجاز المراد تفعيله.
Player Ref (Actor)مرجع إلى اللاعب الذي فعّل الإنجاز.

حالة الاستخدام: استدعِها كلما نفّذ اللاعب إجراءً مرتبطًا بإنجاز (قتل، جمع، استكشاف، تفاعل، إلخ).

Get Achievement Data

تبحث عن نسخة نظام الإنجازات الافتراضية وتُرجع مرجعها.

Get Achievement Data By Reference

تُرجع نظام الإنجازات المرتبط بلاعب محدد، بحيث يكون لكل لاعب بيانات إنجازات خاصة به.

ملاحظة معمارية مهمة

جميع الدوال في هذا النظام باستثناء Achievement Trigger مبنية داخليًا فوق Get Achievement Data. وهذا يعني أنها:

تنبيه للألعاب الجماعية / عبر الإنترنت

إذا كنت تعمل على لعبة عبر الإنترنت أو متعددة اللاعبين، فـلا تعتمد على هذه الدوال في منطق اللعب. استخدمها في الواجهة فقط لعرض التقدّم والإنجازات المكتملة والتصنيفات.

لاستخدام مرجع نظام إنجازات خاص بلاعب محدد:

  1. انتقل إلى BP_AchievementFunctions.
  2. ابحث عن الدالة التي تريد استخدامها.
  3. كرّر الدالة (Duplicate).
  4. عدّل الدالة الجديدة لتستخدم Get Achievement Data By Reference.
  5. أضف مُدخَل Player Reference إلى الدالة.

يمنحك هذا تحكمًا كاملًا في بيانات الإنجازات الخاصة بكل لاعب، ومنطقًا آمنًا للعب الجماعي.

لماذا يختلف Achievement Trigger؟

Achievement Trigger لا تعتمد على Get Achievement Data. فهي تتطلب معرّف الإنجاز (Achievement ID) ومرجع اللاعب (Player Reference)، مما يجعلها آمنة لمنطق اللعب، وجاهزة للعب الجماعي، ويتحكم بها المطوّر بالكامل.

ملاحظة للخرائط التي لا تحتوي على لاعب

في أي مستوى لا يحتوي على لاعب (Player) أو شخصية (Character)، لن يعمل نظام الإنجازات افتراضيًا. لحل ذلك، أضف BP_AchievementsWorld إلى مستواك واضبط خصائصه:

الخاصيةالوصف
Achievement Classاختر مكوّن الإنجازات الذي تريد استخدامه (مثل BP_AchievementStyle_01).
EAchievement Date Formatتنسيق التاريخ لتواريخ الإكمال (مثل USA، MM/DD/YYYY).
Use Category Optimized Loadingتفعيل التحميل المُحسَّن حسب التصنيف.
Auto Load Categoryتفعيل التحميل التلقائي للتصنيفات.

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

أدوات إضافية

For Each With Delay (Macro)

تعمل مثل حلقة For Each Loop العادية، لكنها تضيف تأخيرًا بين كل تكرار وآخر.

الطرف (Pin)الوصف
Arrayالمصفوفة المراد التكرار عليها.
Duration (Float)الفاصل الزمني بين معالجة كل عنصر (القيمة الافتراضية 0.05).
Loop Body، Array Element، Array Index، Completedالسلوك نفسه كما في حلقة For Each Loop القياسية.

مفيدة لتحميل عناصر الواجهة أو الإنجازات أو أي بيانات مصفوفة بشكل متسلسل دون تجميد اللعبة.

Get All Data Table Items (Macro)

تسترجع جميع الصفوف من Data Table دون الحاجة إلى كتابة عدة عُقد (Nodes).

الطرف (Pin)الوصف
Table (input)جدول البيانات (Data Table) الذي تريد قراءته.
Loop Bodyيعمل لكل صف. Array Element / Out Row هو بنية الصف (row struct) للعنصر الحالي.
Row Not Foundيُفعَّل إذا لم يكن الصف موجودًا.
Completedيُفعَّل بعد معالجة جميع الصفوف.

مفيدة للتكرار السريع على جداول البيانات بطريقة نظيفة وفعّالة.