یک 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 بگذار.
سه Part با Anchored روشن در طول مسیر بگذار و آنها را بکش داخل پوشه. اسمهایشان را 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 یک اسم پوشهی ویژه است. مقدارهای داخلش در فهرست بازیکنها نشان داده میشوند، پس همه Stage ات را میبینند.
وقتی شخصیت ظاهر میشود، اسکریپت آن را به چکپوینتی میبرد که اسمش با Stage بازیکن یکی است.
با لمس چکپوینت، Stage فقط وقتی بالا میرود که همان چکپوینت بعدی باشد. این جلوی رد شدن از مراحل را میگیرد.
جزئیات بیشتر
Folder شیءهای دیگر را نگه میدارد، مثل یک پوشه در کامپیوتر. خودش در بازی کاری نمیکند.
برای کشیدن یک قطعه داخل پوشه، اسمش را در Explorer روی اسم Checkpoints بکش و رها کن. بعد قطعه یک قدم به داخل، زیر پوشه، مینشیند.
قطعههای چکپوینت را نازک و پهن بساز، مثلاً Size 6, 0.4, 6، و روی سکوها بگذار. رنگ متفاوت کمک میکند بازیکنها آنها را ببینند.
برای آزمایش: F5 را بزن و به فهرست بازیکنها در گوشهی بالا سمت راست نگاه کن. Stage 1 را نشان میدهد. چکپوینت 2 را لمس کن تا به 2 عوض شود.
چکپوینتها را باید به ترتیب لمس کرد. لمس 3 قبل از 2 کاری نمیکند.
اشتباه رایج. اسم Part ها را Checkpoint1 یا One گذاشتن. اسکریپت دنبال اسمهای دقیق 1 و 2 و 3 میگردد.
این قدم برای من کار نمیکند
اول این سه چیز را بررسی کن
اسم هر قطعه و اسکریپت دقیقاً مثل آموزش است، با همان حروف بزرگ.
اسکریپت داخل شیء درست است. به برچسب بالای کادر کد نگاه کن.
پنجرهی 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 را بزن، مسیر را تمام کن و روی قطعهی طلایی بایست. سر شروع برمیگردی و Stage دوباره 1 را نشان میدهد.
علت مکث 2 ثانیهای این است که یک قدم قطعه را چندین بار لمس میکند.
این قدم برای من کار نمیکند
اول این سه چیز را بررسی کن
اسم هر قطعه و اسکریپت دقیقاً مثل آموزش است، با همان حروف بزرگ.
اسکریپت داخل شیء درست است. به برچسب بالای کادر کد نگاه کن.
پنجرهی Output را از منوی Window باز کن. متن قرمز اسکریپت و خطی را که مشکل دارد نشان میدهد.