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

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

انقر على بلاطة حزمة ميزات Core، ثم بلاطة حزمة ميزات مكافآت التفاعل. يتم عرض كلا مجلدات الحزمة في نافذة المستكشف.
اسحب المجلدات إلى ReplicatedStorage.
تهيئة الحزمة
نقل الحزم إلى ReplicatedStorage واختبار لعبتك يقوم بتشغيل البرنامج النصي EngagementRewardsExample في ReplicatedStorage.EngagementRewards.Server.Examples.
يظهر هذا البرنامج النصي كيفية تهيئة الحزمة للاستخدام في لعبتك، والتي تتضمن استدعاء عدة برامج نصية وحدات وتعريف دالة rewardClaimedHandlerFunction() التي تعطي في النهاية المكافأة (المكافآت) للاعب.
يجب أن تعيد هذه الدالة قيمة منطقية. في البرنامج النصي المثال، يمكنك أن ترى أنها لا تعطي أي مكافآت للاعب؛ إنها فقط تطبع اللاعب، المكافأة، والكمية التي يتم المطالبة بها.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EngagementRewardsConfig = require(ReplicatedStorage.EngagementRewards.Configs.EngagementRewardsConfig)
local EngagementRewards = require(ReplicatedStorage.EngagementRewards.Server.EngagementRewards)
local EngagementRewardsUtils = require(ReplicatedStorage.EngagementRewards.Utils.EngagementRewardsUtils)
local Types = require(ReplicatedStorage.EngagementRewards.Configs.Types)
-- استبدل هذه الدالة بمعالج المكافآت الخاص بك
-- يجب أن تتعامل هذه الدالة مع حدث المطالبة بالمكافأة للـ rewardId الممرر
local function rewardClaimedHandlerFunction(player: Player, rewardId: RewardId, quantity: number): (boolean, string?)
print(`تم المطالبة بالمكافأة {rewardId} من قبل {player} بكمية {quantity}`)
return true
end
-- المزيديمكنك إما تعديل هذا البرنامج النصي مباشرة أو نقله إلى ServerScriptService إذا كان هذا هو الموقع المفضل لديك لشفرة الخادم. كما هو، البرنامج النصي مفيد فقط لأغراض الاختبار.
تختلف طريقة منح المكافأة للاعب حسب اللعبة. في بعض الألعاب، قد تمنح دفعة للعبة أو فقط تزيد من عدد الذهب لدى اللاعب. في ألعاب أخرى، قد يكون لديك نظام جرد مخصص، بينما قد تضع أخرى عنصرًا في حقائب اللاعبين. في جميع الحالات، يجب عليك استبدال rewardClaimedHandlerFunction() بدالتك الخاصة.
إضافة المكافآت والمعايير
تحدث معظم تخصيصات المكافآت داخل ReplicatedStorage.EngagementRewards.Configs.EngagementRewardsConfig. يحدد هذا البرنامج النصي الوحدوي المكافأة والمتطلبات لفتحها.
يمكنك رؤية جميع إعلانات الأنواع الكاملة (أو إضافة أنواع جديدة) في ReplicatedStorage.EngagementRewards.Configs.Types، ولكنك ربما تحتاج فقط للعمل مع EngagementRewardsConfig. تتضمن حزمة الميزات نوعين من المكافآت: Time وDaily.
local engagementRewardsConfig: Types.EngagementRewardsConfig = {
[Types.RewardType.Time] = {
tabDisplayName = "الوقت",
tabOrder = 1,
description = "استمر في اللعب لفتح المكافآت!",
rewards = {
MinutesPlayed1 = {
icon = 116913478160966,
displayName = "رمح الجليد",
requiredSecondsInGame = 1 * 5,
},
-- المزيد
[Types.RewardType.Daily] = {
tabDisplayName = "يومي",
tabOrder = 2,
description = "العب يوميًا لفتح المكافآت!",
rewards = {
DailyStreak1 = {
icon = 116913478160966,
displayName = "رمح الجليد",
requiredDaysVisitedStreak = 1,
effect = Types.RewardEffect.Valuable,
},
-- المزيدتتطلب كلا نوعي المكافآت أيقونة، وهي معرف أصل Roblox لصورة (ليس ديكال). من المحتمل أنك تريد أيضًا اسم عرض للاستخدام في واجهة المستخدم. حدد quantity للقيم غير 1. يمكنك أيضًا اختيار تعيين مكافأة كقيمة (effect = Types.RewardEffect.Valuable) لمنحها إطار خلفية مختلف في واجهة المستخدم.
| Variable | Type | Description | Default | Required |
|---|---|---|---|---|
| icon | Number | معرف أصل Roblox لأيقونة واجهة المستخدم. | N/A | نعم |
| displayName | String | اسم للمكافآت للاستخدام في واجهة المستخدم. | الـ RewardId | لا |
| quantity | Number | عدد العناصر التي سيتم مكافأتها. | 1 | لا |
| effect | RewardEffect | التأثير البصري للاستخدام في واجهة المستخدم. انظر تخصيص واجهة المستخدم. | Types.RewardEffect.Default | لا |
مكافآت الوقت
تفتح مكافآت Time بعد عدد معين من الثواني في اللعبة. خصص هذه الأرقام لتلبية احتياجاتك. قد تستخدم أرقام صغيرة للاختبار السهل، وفي اللعبة المنشورة، تمنح مكافأة بعد 10 دقائق، وأخرى بعد 30 دقيقة، وأخرى بعد ساعة، وهكذا.
تجعل الضرب الأرقام بالثواني أسهل للبشر للعمل بها، لذا لمدة ساعتين، قد تفضل تحديد 2 * 60 * 60 بدلاً من 7200.
| Variable | Type | Description | Default | Required |
|---|---|---|---|---|
| requiredSecondsInGame | Number | عدد الثواني (عدد صحيح موجب) التي يجب أن يقضيها اللاعب في اللعبة لكسب المكافأة. | N/A | نعم |
مكافآت يومية
تفتح مكافآت Daily بعد عدد معين من تسجيلات الدخول اليومية المتتالية. على سبيل المثال، في اليوم الأول الذي يسجل فيه اللاعب الدخول، قد تعطيهم ثلاث جرعات أو لفافة قرفة. في الأيام التالية، قد تكافئهم بمستهلكات أكثر قيمة، تليها عنصر دائم، مثل صنارة صيد جديدة، بعد سبعة أيام متتالية.
| Variable | Type | Description | Default | Required |
|---|---|---|---|---|
| requiredDaysVisitedStreak | Number | عدد الأيام المتتالية التي يجب أن يتصل فيها اللاعب باللعبة لكسب المكافأة. | N/A | نعم |
هناك خياران إضافيان لتكوين مكافآت يومية متاحة في DailyRewardTabConfig.
[Types.RewardType.Daily] = {
tabDisplayName = "يومي",
tabOrder = 2,
description = "العب يوميًا لفتح المكافآت!",
isHiddenOnJoin = true,
isAlignedToStreakResetTime = true,
rewards = {
DailyStreak1 = {
icon = 116913478160966,
displayName = "رمح الجليد",
requiredDaysVisitedStreak = 1,
},
-- المزيد| Variable | Type | Description | Default | Required |
|---|---|---|---|---|
| isHiddenOnJoin | Boolean | عندما تكون صحيحة، لا تظهر المكافآت تلقائيًا عند الانضمام إلى اللعبة. عندما تكون خاطئة، تظهر المكافآت تلقائيًا عند الانضمام إلى اللعبة إذا كان لدى اللاعب مكافأة يومية جديدة للمطالبة بها. | خاطئة | لا |
| isAlignedToStreakResetTime | Boolean | عندما تكون صحيحة، يمكن المطالبة بمكافآت اليوم الثاني بعد 24 ساعة من وقت المطالبة باليوم الأول. عندما تكون خاطئة، يمكن المطالبة بمكافآت اليوم الثاني في منتصف الليل الأول بعد وقت المطالبة باليوم الأول. على سبيل المثال، إذا سجل اللاعب الدخول في الساعة 11:00 مساءً (23:00) وطالب بمكافأته في اليوم الأول، تعني القيمة الصحيحة أنهم لا يمكنهم المطالبة بمكافأة اليوم الثاني حتى الساعة 11:00 مساءً في اليوم التالي. تعني القيمة الخاطئة أنهم يمكنهم المطالبة بمكافأة اليوم الثاني في الساعة 12:00 صباحًا (00:00)، بعد ساعة واحدة. تكون المكافآت لليوم الثالث وما بعده متاحة دائمًا بعد 24 ساعة من وقت المطالبة باليوم السابق. | خاطئة | لا |
تخصيص واجهة المستخدم
في القسم السابق، قد تكون قد لاحظت الحقول tabDisplayName وtabOrder وdescription، التي تسمح بتخصيص أساسي لواجهة المستخدم. يمكنك أيضًا العثور على بعض سلاسل واجهة المستخدم في ReplicatedStorage.FeaturePackagesCore.Configs.TranslationStrings.

لتحديد خلفية مكافأة جديدة باستخدام المتغير effect، أضف إطارًا إلى ReplicatedStorage.EngagementRewards.Objects.RewardItemFrames. ثم أضف اسم الإطار إلى جدول Types.RewardEffect في ReplicatedStorage.EngagementRewards.Configs.Types.
لمزيد من التخصيص الشامل، قم بتعديل الكائنات في ReplicatedStorage.EngagementRewards.Objects. على سبيل المثال، قد تقوم بتعديل BackgroundColor3 لإطار RewardsHudButton.Background أو Color لـ FooterContentFrame.ClaimableUIGradient.
نقطة الدخول لواجهة المستخدم هي البرنامج النصي ReplicatedStorage.EngagementRewards.Client.UIController، الذي يحصل على الكائنات اللازمة ويهيئ واجهة المستخدم. إذا قمت بإضافة أو إعادة تسمية كائنات على المستوى الأعلى (بدلاً من إضافة أطفال فقط أو تعديل الخصائص)، فمن المحتمل أنك بحاجة إلى تحديث الشفرة في هذا المجلد للتعامل معها.