إضافة وحدوية لنظام الخبرة (XP) والمستويات في Unreal Engine (بدعم C++ وBlueprint) مع مزامنة عبر الشبكة (Replication). تتضمن منحنيات تعتمد على البيانات، وحدودًا قصوى للمستوى عبر نظام الصعود (Ascension)، ومكافآت المراحل، وتحويل الخبرة الفائضة (Overflow XP).

AMLSLevelComponent إلى أي Actor: اللاعبون أو الأعداء أو الأسلحة أو المباني.Ascend.AMLS Level Component إلى الـ Actor (شخصيتك) وعيِّن أصل البيانات في الحقل Level Config Data.AddXP كلما اكتسب الـ Actor خبرة.OnLevelUpDelegate / OnXPChangedDelegate لتشغيل واجهة المستخدم (UI).// مثال C++
if (UAMLSLevelComponent* Level = Actor->FindComponentByClass<UAMLSLevelComponent>()) { Level->OnLevelUpDelegate.AddDynamic(this, &AMyClass::HandleLevelUp); Level->AddXP(250); // على الخادم فقط }
UAMLSLevelComponent)تبدأ من المستوى 1، و0 خبرة، ومرحلة الصعود 1. الدوال المُعلَّمة بـ Authority تعمل على الخادم فقط.
| الدالة | النوع | الوصف |
|---|---|---|
| AddXP(Amount) | Authority | تضيف الخبرة وتعالج الارتقاءات المتتالية في المستوى. عند بلوغ أقصى مستوى مطلق، تُحوَّل الخبرة إلى التحويل الفائض. |
| SetLevel(NewLevel) | Authority | تضيف الخبرة وتعالج الارتقاءات المتتالية في المستوى. عند بلوغ أقصى مستوى مطلق، تُحوَّل الخبرة إلى التحويل الفائض. |
| AddLevels(LevelsToAdd) | Authority | تمنح عددًا ثابتًا من المستويات مع احترام حدود الصعود القصوى. |
| Ascend() | Authority | تنتقل إلى مرحلة الصعود التالية إذا كانت CanAscend() تساوي true. |
| ResetProgression() | Authority | تعيد المستوى والخبرة والمرحلة إلى القيم الافتراضية (مفيدة لنظام الـ Prestige). |
| LoadProgressionSaveData(Data) | Authority | تستعيد التقدّم من بنية الحفظ. |
| GetProgressionSaveData() | Pure | تُرجِع لقطة من النوع FAMLSProgressionSaveData. |
| GetCurrentLevel /GetCurrentXP | Pure | القيم الحالية. |
| GetXPRequiredForNextLevel | Pure | الخبرة اللازمة لإتمام المستوى الحالي. |
| GetRemainingXPToNextLevel | Pure | الخبرة اللازمة لإتمام المستوى الحالي. |
| GetXPProgressPercentage | Pure | قيمة شريط التقدّم من 0.0 – 1.0. |
| GetCurrentLevelCap | Pure | قيمة شريط التقدّم من 0.0 – 1.0. |
| GetCurrentLevelCap | Pure | الحد الأقصى الصارم لمرحلة الصعود الحالية. |
| IsAtCurrentLevelCap/IsAtAbsoluteMaxLevel | Pure | فحوصات الحد الأقصى. |
| CanAscend | Pure | تكون true عند بلوغ الحد الحالي مع عدم بلوغ أقصى مستوى مطلق. |
| GetCurrentAscensionPhase | Pure | المرحلة الحالية (تبدأ من 1). |
| GetRequiredAscensionPhaseForLevel | Pure | المرحلة المطلوبة لبلوغ مستوى معيّن. |
| HasReachedLevel(Level) | Pure | تكون true إذا كان المستوى الحالي ≥ المستوى المستهدف. |
| GetLevelStatus(Level) | Pure | تُرجِع FAMLSLevelStatusData: bHasReached, bRequiresAscension, bIsAbsoluteMaxLevel, bIsInvalid. مثالية لواجهات خريطة المستويات. |
| GetRewardsForLevel(Level) | Pure | عناصر المكافآت المُعدّة لمستوى معيّن. |
UAMLSLevelUpConfigDataAsset)| الخاصية | الافتراضي | الوصف |
|---|---|---|
| Max Level | 50 | أعلى مستوى مطلق (الحد الأدنى 2). |
| XP Curve Method | Formulaic | Explicit Array أو Formulaic أو Float Curve Asset. |
| System ID | Player | معرّف يُستخدم لمطابقة معالِجات المكافآت مع هذا الأصل. |
| Use Ascension System | false | تُفعِّل حدودًا قصوى للمستوى تتطلب استدعاء Ascend(). |
| Ascension Level Caps | فارغ | الحد الأقصى لكل مرحلة، مثال: [20, 40]. |
| Explicit XP Thresholds | فارغ | الفهرس 0 = الخبرة اللازمة لمغادرة المستوى 1. تعود المدخلات المفقودة إلى Level × FormulaBaseXP. |
| Formula Base XP / Multiplier / Exponent | 100 / 1.2 / 1.5 | راجع الصيغة أدناه. |
| Visual Curve Asset | لا شيء | منحنى Float: المحور X = المستوى، والمحور Y = الخبرة المطلوبة. |
| Reward Milestones | فارغ | قوائم لكل مستوى من (RewardTag, RewardCount). |
| Custom Processor Milestones | فارغ | فئة معالِج المكافآت لكل مستوى. |
| Convert Overflow XP To Currency | false | تُفعِّل تحويل الفائض عند أقصى مستوى. |
| Overflow Currency Tag | لا شيء | الوسم (Tag) الذي يُرسَل مع حدث التحويل. |
| Overflow Conversion Multiplier | 10.0 | العملة = max(1, round(XP × multiplier)). |
XP required = round( FormulaBaseXP × Level ^ FormulaExponent × FormulaMultiplier ) (minimum 1)
بالإعدادات الافتراضية، يحتاج المستوى 1 إلى 120 خبرة، ويحتاج المستوى 10 إلى نحو 3,795 خبرة. لا تُطلب أي خبرة عند Max Level أو بعده.
يتيح لك الصعود تقييد التقدّم بحدوث إجراء من اللاعب (مواد، مهمة، زعيم). فعِّل Use Ascension System وحدِّد الحدود القصوى:
AscensionLevelCaps = [20, 40, 50] // الحد في المرحلة 1 هو 20، وفي المرحلة 2 هو 40، وفي المرحلة 3 هو 50
Ascend() على الخادم.OnAscendedDelegate، وتستمر الخبرة المحفوظة في رفع المستوى.CanAscend() لتفعيل زر Ascend، وGetLevelStatus() لعرض أقفال الصعود على خريطة المستويات.أضِف مدخلات إلى Reward Milestones مع مستوى مستهدف وقائمة بعناصر المكافآت (Gameplay Tag + العدد). عند بلوغ المستوى، يقوم OnRewardsProcessedDelegate ببثّ العناصر حتى تتمكن لعبتك من منحها.
للمنطق المخصّص، أنشئ فئة فرعية من UAMLSLevelUpRewardProcessor (في C++ أو Blueprint) وسجِّلها ضمن Custom Processor Milestones للمستوى المطلوب.
NativeProcessTag.IAMLSLevelableInterface، وإلا سيتم تخطّي الاستدعاء مع تحذير.// C++
class UMyRewardProcessor : public UAMLSLevelUpRewardProcessor
{
protected:
virtual void NativeProcessTag(AActor* Target, const TArray<FAMLSLevelRewardItem>& Items, int32 Level) override;
};IAMLSLevelableInterface)طبّقها على الـ Actors التي يجب أن تتلقى الاستدعاءات. يمكن تنفيذها عبر Blueprint.
| الدالة | الوصف |
|---|---|
| GetLevelComponent() | تُرجِع المكوّن UAMLSLevelComponent الخاص بالـ Actor. |
| OnLevelUp(NewLevel) | يُستدعى عند رفع المستوى: لتطبيق الإحصاءات أو الشفاء أو فتح المحتوى. |
| الحدث | المعاملات | متى يُطلَق |
|---|---|---|
| OnLevelUpDelegate | NewLevel, Owner | عند اكتساب مستوى (وعلى العملاء أيضًا عند مزامنة المستوى). |
| OnXPChangedDelegate | CurrentXP, XPToNextLevel, Percent | عند تغيّر الخبرة أو المستوى؛ وكذلك عند BeginPlay. |
| OnRewardsProcessedDelegate | LevelAchieved, Rewards, Owner | عند بلوغ مستوى له مكافآت أو معالِج. |
| OnOverflowXPConvertedDelegate | WastedXP, CurrencyEarned, CurrencyTag, Owner | عند اكتساب خبرة في أقصى مستوى مع تفعيل التحويل. |
| OnAscendedDelegate | NewAscensionPhase, Owner | عند تغيّر مرحلة الصعود. |
FAMLSProgressionSaveData تحتوي على SavedLevel, SavedXP, SavedAscensionPhase وهي موسومة بـ SaveGame. خزِّنها في كائن SaveGame الخاص بك.
// حفظ SaveObj->Progression = LevelComp->GetProgressionSaveData(); // تحميل (الخادم) LevelComp->LoadProgressionSaveData(SaveObj->Progression);
عند التحميل، يتم التحقق من القيم مقابل الحدود الحالية ومعالجة الخبرة المعلّقة.
bCanEverTick = false، لذلك لا توجد أي تكلفة في كل إطار.Reward.Stat في Gameplay Tags الخاصة بمشروعك.