أضف Part جديدًا بين منصتين. اجعله أحمر، واجعل Material يساوي Neon، وفعّل Anchored وسمّه Lava.
في Explorer مرّر الفأرة فوق Lava، واضغط زر + واختر Script.
احذف السطر الموجود فيه والصق هذا الكود.
Lava > Script
local lava = script.Parent
lava.Touched:Connect(function(hit)
local humanoid = hit.Parent:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid.Health = 0
end
end)
ماذا يفعل كل جزء
script.Parent هو الـ Part الذي يوجد فيه السكربت. وهنا هو الحمم.
يعمل Touched في كل مرة يلمس فيها شيء الـ Part. و hit هو الشيء الذي لمسه، مثل قدم.
hit.Parent هو الشخصية كاملة. إذا كان فيها Humanoid فهي لاعب، لذلك يجعل السكربت Health يساوي 0.
المزيد من التفاصيل
Material قائمة في Properties. اضغط عليها واختر Neon. يجعل Neon القطعة تتوهج.
عندما تضيف Script يُفتح في تبويب جديد وفيه سطر واحد من الكود. اضغط داخل الكود، ثم Ctrl+A لتحديد كل شيء، ثم Ctrl+V للصق فوقه.
ارجع إلى عالمك بالضغط على التبويب الذي عليه اسم مكانك.
للتجربة: اضغط F5 وامشِ داخل الحمم. تتفكك شخصيتك ثم تعود عند البداية.
اجعل الحمم عريضة ومسطحة، مثلًا Size 12, 1, 6، وضعها أخفض قليلًا من المنصات، حتى تسقط فيها القفزة الخاطئة.
هذه الخطوة لا تعمل معي
تحقق من هذه الأمور الثلاثة أولًا
اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.
في Explorer مرّر الفأرة فوق Workspace، واضغط + وأضف Folder. سمّه Checkpoints.
ضع ثلاثة Parts مثبّتة على طول المضمار واسحبها إلى الـ Folder. سمّها 1 و2 و3. الـ Part رقم 1 يكون على منصة البداية.
مرّر الفأرة فوق ServerScriptService، واضغط + وأضف Script. الصق هذا الكود.
ServerScriptService > Script
local Players = game:GetService("Players")
local checkpoints = workspace:WaitForChild("Checkpoints")
Players.PlayerAdded:Connect(function(player)
local stats = Instance.new("Folder")
stats.Name = "leaderstats"
stats.Parent = player
local stage = Instance.new("IntValue")
stage.Name = "Stage"
stage.Value = 1
stage.Parent = stats
player.CharacterAdded:Connect(function(character)
local root = character:WaitForChild("HumanoidRootPart")
local point = checkpoints:FindFirstChild(tostring(stage.Value))
if point then
task.wait(0.1)
root.CFrame = point.CFrame + Vector3.new(0, 4, 0)
end
end)
end)
for _, point in ipairs(checkpoints:GetChildren()) do
point.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
local stats = player and player:FindFirstChild("leaderstats")
if not stats then return end
local number = tonumber(point.Name)
if number == stats.Stage.Value + 1 then
stats.Stage.Value = number
end
end)
end
ماذا يفعل كل جزء
leaderstats اسم خاص لـ Folder. تظهر القيم الموجودة داخله في قائمة اللاعبين، فيرى الجميع Stage الخاص بك.
عندما تظهر الشخصية، ينقلها السكربت إلى نقطة الحفظ التي اسمها يساوي Stage اللاعب.
لمس نقطة حفظ يرفع Stage فقط إذا كانت هي التالية. هذا يمنع اللاعبين من تخطي المراحل.
المزيد من التفاصيل
Folder يضم أشياء أخرى، مثل المجلد في الحاسوب. وهو لا يفعل شيئًا في اللعبة بنفسه.
لسحب قطعة إلى المجلد، اسحب اسمها في Explorer إلى الاسم Checkpoints ثم أفلتها. تصير القطعة بعدها مزاحة خطوة واحدة إلى الداخل، تحت المجلد.
اجعل قطع نقاط الحفظ رفيعة وعريضة، مثلًا Size 6, 0.4, 6، وضعها فوق المنصات. واللون المختلف يساعد اللاعبين على ملاحظتها.
للتجربة: اضغط F5 وانظر إلى قائمة اللاعبين في الزاوية العلوية اليمنى. تعرض Stage 1. المس نقطة الحفظ 2 فيتغير إلى 2.
يجب لمس نقاط الحفظ بالترتيب. ولمس الثالثة قبل الثانية لا يفعل شيئًا.
خطأ شائع. أن تسمي الـ Parts باسم Checkpoint1 أو One. السكربت يبحث عن الأسماء 1 و2 و3 بالضبط.
هذه الخطوة لا تعمل معي
تحقق من هذه الأمور الثلاثة أولًا
اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.
ضع Part كبيرًا مثبّتًا في النهاية وسمّه Finish. اجعله ذهبيًا ليرى اللاعبون الهدف.
أضف Script إلى Finish والصق هذا الكود.
Finish > Script
local Players = game:GetService("Players")
local finish = script.Parent
local cooldown = {}
finish.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
local stats = player and player:FindFirstChild("leaderstats")
if not stats or cooldown[player] then return end
cooldown[player] = true
stats.Stage.Value = 1
player:LoadCharacter()
task.wait(2)
cooldown[player] = nil
end)
ماذا يفعل كل جزء
GetPlayerFromCharacter تعرف أي لاعب لمس خط النهاية.
الجدول cooldown يمنع الكود من العمل مرات كثيرة في الثانية نفسها.
يعود Stage إلى 1 ويرسل LoadCharacter اللاعب إلى البداية ليجرب مرة أخرى.
المزيد من التفاصيل
لتجعلها ذهبية، اضغط على الحقل Color في Properties واختر لونًا أصفر. ويجعلها Material Neon تلمع.
الحجم Size 12, 1, 12 مناسب للنهاية. ضعها بعد القفزة الأخيرة، وأعلى قليلًا من الباقي.
للتجربة: اضغط F5، وأنهِ المضمار وقف على القطعة الذهبية. تعود عند البداية ويعرض Stage القيمة 1 من جديد.
السبب في فترة الانتظار البالغة ثانيتين أن خطوة واحدة تلمس القطعة مرات كثيرة.
هذه الخطوة لا تعمل معي
تحقق من هذه الأمور الثلاثة أولًا
اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.