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

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




من المهم ملاحظة الاسم الدقيق لـ BrickColor لخاصية Team.Color لأن اللعبة تستخدم هذا الاسم في العديد من السكربتات في اللعبة لتتبع اللاعبين أثناء فرزهم إلى فرق، وزيادة النقاط عندما يقوم اللاعبون بإصابة لاعبين معادين خلال جولة، وتحديث عناصر واجهة المستخدم المخصصة. على سبيل المثال، عندما تبدأ الجولة، يتطلب ReplicatedStorage ⟩ HUDGuiSetup startSyncingTeamColor و startSyncingTeamPoints اللذان يشيران إلى Team.Color لأداء إجراءات فريدة لكل فريق.
startSyncingTeamColor يشير إلى Team.Color بحيث يمكنه تعيين اللون الصحيح والرمز لمؤشر فريق اللاعب في الزاوية السفلى اليسرى من شاشته.


local function setPlayerTeamIcon(gui: ScreenGui)
for _, teamColorIcon in gui.PlayerDisplay.TeamIcons:GetChildren() do
local iconTeamColor = teamColorIcon:GetAttribute(GuiAttribute.teamColor)
teamColorIcon.Visible = localPlayer.TeamColor == iconTeamColor
end
end
local function startSyncingTeamColor(gui: ScreenGui)
setPlayerTeamIcon(gui)
localPlayer:GetPropertyChangedSignal("Team"):Connect(function()
setPlayerTeamIcon(gui)
end)
endعرض مؤشرات الفرق
بمجرد فرز اللاعب إلى فريق، يحتاج إلى أن يكون قادرًا على فهم بسرعة إلى أي فريق ينتمي، والتمييز بين حلفائه وأعضاء الفريق المعادي. هذه القدرة مهمة لأن أسلوب اللعب في لعبة إطلاق النار من منظور الشخص الأول يتطلب من اللاعبين اتخاذ قرارات استراتيجية سريعة أثناء وجودهم في مناطق القتال حتى لا يتم إصابتهم ويخسروا الجولة.
لتجهيز اللاعبين للنجاح، توفر لعبة الليزر التوضيحية مؤشرات فرق متعددة على الشاشة وفي الفضاء ثلاثي الأبعاد:
- مؤشر اللاعب – واجهة مستخدم مخصصة على الشاشة تعرض لون الفريق ورمزه.
- مؤشر الفريق – واجهة مستخدم مخصصة في اللعبة تعرض لون الفريق.
- مؤشر لوحة المتصدرين – واجهة مستخدم افتراضية لخدمة الفرق تعرض اللاعبين تحت لون فريقهم.
- تلوين الاسم – واجهة مستخدم افتراضية لخدمة الفرق تلوّن اسم اللاعب فوق رأسه بلون فريقه.




لا تحتاج إلى القيام بأي عمل إضافي لمؤشر لوحة المتصدرين أو تلوين الاسم بخلاف تعيين ألوان الفرق من القسم السابق من البرنامج التعليمي، ولكن مؤشرات واجهة المستخدم المخصصة تتطلب مزيدًا من الجهد البرمجي لعرض المؤشرات وحجب مؤشرات الأعداء عندما تكون خلف الجدران. للحصول على شرح كامل للسكربتات التي تتحكم في سلوك واجهة المستخدم المخصصة، بالإضافة إلى كيفية تنفيذ كل عنصر واجهة مستخدم بنفسه، راجع مؤشر اللاعب و مؤشر الفريق من منهج واجهة المستخدم.
تعطيل النيران الصديقة
بينما تعاقب بعض ألعاب إطلاق النار من منظور الشخص الأول اللاعبين الذين يصيبون زملاءهم في الفريق، فإن لعبة الليزر التوضيحية تسمح بأسلوب لعب أكثر تسامحًا من خلال تعطيل النيران الصديقة. يسمح هذا القرار التصميمي للجميع بزيادة نقاط فريقهم فقط، وليس تقليلها بسبب حوادث اللعب.
لفهم كيفية تنفيذ العينة لهذه الوظيفة، تحقق من كيفية تعامل ServerScriptService ⟩ LaserBlastHandler ⟩ processTaggedPlayers ⟩ onPlayerTagged مع إلحاق الضرر باللاعبين المصابين. عندما يكتشف الخادم تصادمًا بين انفجار لاعب ولاعب آخر، فإنه يستدعي وظيفة onPlayerTagged لفهم أي لاعب أطلق الانفجار، وأي لاعب أصيب بالانفجار، وكمية الضرر التي يجب إزالتها من صحة اللاعب وفقًا لنوع البندقية.
local function onPlayerTagged(playerBlasted: Player, playerTagged: Player, damageAmount: number)قبل أن يقلل من الصحة، يتحقق السكربت أولاً مما إذا كان اللاعب المصاب في نفس الفريق مع اللاعب الذي بدأ الانفجار. إذا كانوا في نفس الفريق، يتجاهل السكربت بيانات الانفجار تمامًا.
local character = playerTagged.Character
local isFriendly = playerBlasted.Team == playerTagged.Team
-- منع النيران الصديقة
if isFriendly then
return
endومع ذلك، إذا كان اللاعب المصاب هو في الفريق المعادي، فإن اللاعب يتلقى الكمية المناسبة من الضرر وفقًا لنوع البندقية. بالإضافة إلى ذلك، إذا تلقى اللاعب ما يكفي من الضرر ليصبح مصابًا، يكافئ السكربت نقطة لفريق اللاعب الذي بدأ الانفجار. لمزيد من المعلومات حول كيفية تتبع العينة للنقاط، راجع إضافة جولات لاحقًا في البرنامج التعليمي.
local humanoid = character and character:FindFirstChild("Humanoid")
if humanoid and humanoid.Health > 0 then
local damage = math.min(damageAmount, humanoid.Health)
humanoid:TakeDamage(damage)
if humanoid.Health <= 0 then
Scoring.incrementScore(playerBlasted, 1)
end
end
end
return onPlayerTaggedإذا كنت ستختبر اللعبة الآن، فسيظهر جميع اللاعبين عشوائيًا في أي منطقة ظهور في نهايات الساحة بغض النظر عن الفريق الذي ينتمون إليه، مما يعني أن كل فريق سيظهر بجوار بعضه البعض.
لمعالجة هذه المشكلة، يعلمك القسم التالي من البرنامج التعليمي حول المنطق المخصص وراء تقييد ظهور الفرق في مواقع ظهور معينة، والتعامل مع حالة العميل عندما يغادر اللاعبون منطقة الظهور بعد اختيار بندقيتهم، وإعادة ظهور اللاعبين إلى منطقة ظهورهم أو منطقة الاستقبال عندما تصل صحتهم إلى صفر.