מוסיפים 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 גורם ל-Part לזהור.
כשמוסיפים את ה-Script, הוא נפתח בלשונית חדשה עם שורת קוד אחת. לוחצים בתוך הקוד, לוחצים על Ctrl+A כדי לבחור הכול ועל Ctrl+V כדי להדביק עליו.
חוזרים לעולם שלכם בלחיצה על הלשונית עם שם המקום שלכם.
לבדיקה: לוחצים על F5 וצועדים אל תוך הלבה. הדמות מתפרקת וחוזרת להתחלה.
עושים את הלבה רחבה ושטוחה, למשל Size 12, 1, 6, ומניחים אותה קצת נמוך יותר מהמשטחים, כך שקפיצה שלא הצליחה תסתיים בתוכה.
השלב הזה לא עובד לי
בדקו קודם את שלושת הדברים האלה
השם של כל Part וכל סקריפט זהה בדיוק למדריך, עם אותן אותיות גדולות.
הסקריפט נמצא בתוך העצם הנכון. הסתכלו על התווית שמעל תיבת הקוד.
פתחו את החלון Output מהתפריט Window. טקסט אדום מראה את הסקריפט ואת השורה שבה יש בעיה.
ב-Explorer מעבירים את העכבר מעל Workspace, לוחצים על + ומוסיפים Folder. קוראים לו Checkpoints.
מניחים שלושה Parts עם Anchored לאורך המסלול וגוררים אותם לתוך ה-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 מחזיק עצמים אחרים, כמו תיקייה במחשב. הוא לא עושה כלום במשחק בעצמו.
כדי לגרור Part לתוך ה-Folder, גוררים את השם שלו ב-Explorer על השם Checkpoints ומשחררים. ה-Part יופיע צעד אחד ימינה, מתחת ל-Folder.
עושים את ה-Parts של נקודות הביקורת דקים ורחבים, למשל Size 6, 0.4, 6, ומניחים אותם על גבי משטחים. צבע שונה עוזר לשחקנים לשים לב אליהם.
לבדיקה: לוחצים על F5 ומסתכלים ברשימת השחקנים בפינה הימנית העליונה. כתוב שם Stage 1. נוגעים בנקודת ביקורת 2 והמספר משתנה ל-2.
חייבים לגעת בנקודות הביקורת לפי הסדר. נגיעה ב-3 לפני 2 לא עושה כלום.
טעות נפוצה. קוראים ל-Parts בשמות Checkpoint1 או One. הסקריפט מחפש בדיוק את השמות 1, 2 ו-3.
השלב הזה לא עובד לי
בדקו קודם את שלושת הדברים האלה
השם של כל Part וכל סקריפט זהה בדיוק למדריך, עם אותן אותיות גדולות.
הסקריפט נמצא בתוך העצם הנכון. הסתכלו על התווית שמעל תיבת הקוד.
פתחו את החלון Output מהתפריט Window. טקסט אדום מראה את הסקריפט ואת השורה שבה יש בעיה.
מניחים Part גדול עם Anchored בסוף המסלול וקוראים לו 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, מסיימים את המסלול ועולים על ה-Part הזהוב. אתם חוזרים להתחלה וב-Stage שוב כתוב 1.
ההמתנה של 2 שניות קיימת כי צעד אחד נוגע ב-Part הרבה פעמים.
השלב הזה לא עובד לי
בדקו קודם את שלושת הדברים האלה
השם של כל Part וכל סקריפט זהה בדיוק למדריך, עם אותן אותיות גדולות.
הסקריפט נמצא בתוך העצם הנכון. הסתכלו על התווית שמעל תיבת הקוד.
פתחו את החלון Output מהתפריט Window. טקסט אדום מראה את הסקריפט ואת השורה שבה יש בעיה.