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

يوفّر AchievementSystem نواة نظيفة لإدارة الإنجازات والتصنيفات. لا يفرض أي واجهة مستخدم أو منطق حفظ، فتبقى لك السيطرة الكاملة. تُحمَّل جميع البيانات من جداول البيانات (Data Tables)، مما يتيح التوطين والتوسّع بكفاءة.
For Each With Delay وGet All Data Table Items.يعتمد النظام على تدفّق بيانات بسيط.
BP_AchievementsSystem وأنشئ Child Blueprint Class. سيكون هذا الـ Blueprint الفرعي نسخة نظام الإنجازات الرئيسية لديك.ID (عدد صحيح) وMax Progress (عدد صحيح).BP_Achievements_Child وانتقل إلى Event Graph.Preload Achievement Data. تتطلب ثلاث قيم (انظر الجدول أدناه).| المُدخَل | الوصف |
|---|---|
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).تُرجع الدوال الثلاث أدناه البنية (struct) نفسها:
| الدالة | المُدخَل | الوصف |
|---|---|---|
Get All Completed Achievements | لا يوجد | التقدّم الكلي لجميع الإنجازات في النظام. استخدمها للإحصاءات أو الواجهة أو ملاحظات اللاعب. |
Get All Completed Achievements By Category | Category ID | التقدّم داخل تصنيف محدد. استخدمها لعرض تقدّم التصنيف في الواجهة أو للتحقق مما إذا كان التصنيف مكتملًا بالكامل. |
Get Completed Achievements In Top Level Category | Category ID (تصنيف رئيسي) | التقدّم داخل تصنيف رئيسي، بما في ذلك جميع تصنيفاته الفرعية. استخدمها لعرض تقدّم مجموعة من التصنيفات. |
تُرجع دوال تحميل الإنجازات مصفوفة من البنى (structs) تحتوي على: Row Name، Complete Date (String)، Progress (Int)، Max Progress (Int) وIs Completed (Bool).
| الدالة | المُدخَل | المُخرَج / الاستخدام |
|---|---|---|
Load Achievements By Category | Category ID | جميع الإنجازات في تصنيف ما. استخدمها لملء الواجهة بإنجازات تصنيف واحد. |
Load All Achievements | لا يوجد | كل الإنجازات دفعة واحدة. استخدمها للإحصاءات العامة أو ملخصات نهاية اللعبة. |
Load All Categories | لا يوجد | مصفوفة من البنى (structs) تحتوي على ID وRow. استخدمها لملء قوائم التصنيفات أو لتنفيذ عمليات على مستوى التصنيف. |
Load Child Categories | Category ID (التصنيف الأب / الرئيسي) | ID وRow لكل تصنيف فرعي. استخدمها لعرض التصنيفات الفرعية داخل تصنيف رئيسي. |
Load Top Level Categories | لا يوجد | مصفوفة من البنى (structs) تحتوي على Row وCategory ID وCategory IDs (مصفوفة التصنيفات الفرعية). استخدمها لعرض جميع التصنيفات الرئيسية مع تصنيفاتها الفرعية. |
الدوال الثلاث كلها دوال نقية (Pure Functions).
| الدالة | المُدخَل | المُخرَج | حالة الاستخدام |
|---|---|---|---|
Get Progress | Achievement ID (Int) | Progress (Int)، Max Progress (Int) | عرض أو فحص تقدّم إنجاز واحد. |
Get Row Name | Achievement ID (Int) | Row Name (Name) | استرجاع البيانات المترجمة (الاسم، الوصف، الأيقونة) الخاصة بإنجاز ما. |
Is Completed ? | Achievement ID (Int) | Return Value (Bool) | التحقق من حالة إكمال الإنجاز لمنطق اللعب أو لتحديث الواجهة. |
تُفعّل تقدّم إنجاز محدد وتحدّثه للاعب معيّن.
| المُدخَل | الوصف |
|---|---|
Achievement ID (Int) | معرّف الإنجاز المراد تفعيله. |
Player Ref (Actor) | مرجع إلى اللاعب الذي فعّل الإنجاز. |
حالة الاستخدام: استدعِها كلما نفّذ اللاعب إجراءً مرتبطًا بإنجاز (قتل، جمع، استكشاف، تفاعل، إلخ).
تبحث عن نسخة نظام الإنجازات الافتراضية وتُرجع مرجعها.
Return Value (مرجع BP_AchievementSystem)، Is Valid (Bool). تكون قيمة Is Valid خاطئة (false) إذا لم يكن النظام موجودًا.تُرجع نظام الإنجازات المرتبط بلاعب محدد، بحيث يكون لكل لاعب بيانات إنجازات خاصة به.
Player Ref (مرجع Actor)Return Value (مرجع BP_AchievementSystem)، Is Valid (Bool)جميع الدوال في هذا النظام باستثناء Achievement Trigger مبنية داخليًا فوق Get Achievement Data. وهذا يعني أنها:
لاستخدام مرجع نظام إنجازات خاص بلاعب محدد:
BP_AchievementFunctions.Get Achievement Data By Reference.Player Reference إلى الدالة.يمنحك هذا تحكمًا كاملًا في بيانات الإنجازات الخاصة بكل لاعب، ومنطقًا آمنًا للعب الجماعي.
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 Loop العادية، لكنها تضيف تأخيرًا بين كل تكرار وآخر.
| الطرف (Pin) | الوصف |
|---|---|
Array | المصفوفة المراد التكرار عليها. |
Duration (Float) | الفاصل الزمني بين معالجة كل عنصر (القيمة الافتراضية 0.05). |
Loop Body، Array Element، Array Index، Completed | السلوك نفسه كما في حلقة For Each Loop القياسية. |
مفيدة لتحميل عناصر الواجهة أو الإنجازات أو أي بيانات مصفوفة بشكل متسلسل دون تجميد اللعبة.
تسترجع جميع الصفوف من Data Table دون الحاجة إلى كتابة عدة عُقد (Nodes).
| الطرف (Pin) | الوصف |
|---|---|
Table (input) | جدول البيانات (Data Table) الذي تريد قراءته. |
Loop Body | يعمل لكل صف. Array Element / Out Row هو بنية الصف (row struct) للعنصر الحالي. |
Row Not Found | يُفعَّل إذا لم يكن الصف موجودًا. |
Completed | يُفعَّل بعد معالجة جميع الصفوف. |
مفيدة للتكرار السريع على جداول البيانات بطريقة نظيفة وفعّالة.