מסועים
שיעור 7 מתוך 18 בקורס משחק Roblox: מגדל אינסופי של Coddy.
בשלב המסוע יש חגורה כהה, שמתויגת בתור Conveyor, ודוחפת אותך בחזרה לכיוון שממנו באת. חלק מעוגן לעולם לא זז, אבל אם נותנים לו AssemblyLinearVelocity, כל מה שעומד עליו נסחף יחד איתו, כמו על חגורה אמיתית.
לאיזה כיוון? לכל חלק יש צד קדמי, ו-part.CFrame.LookVector הוא Vector3 שאורכו stud אחד ומצביע החוצה ממנו. החגורה סובבה כך שהצד הקדמי שלה פונה בחזרה למטה לאורך השביל:
part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeedשימוש בכיוון של החלק עצמו מאפשר לבונה לסובב את החגורה כך שתפנה לכל כיוון, והיא עדיין תעבוד, בלי לשנות את הסקריפט.
אתגר
בינוניב־setupStage, תן לכל חלק שמסומן בתג Conveyor מהירות AssemblyLinearVelocity השווה ל־CFrame.LookVector שלו כפול Settings.BeltSpeed.
לחץ על Play ולך נגד כיוון התנועה של המסוע. לאחר מכן לחץ על Check.
נסו בעצמכם
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local Settings = require(game.ReplicatedStorage.Settings)
local stages = ServerStorage.Stages
local tower = nil
print("Each tower has " .. Settings.StageCount .. " stages")
-- כל שחקן מקבל Wins בטבלת המובילים
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Parent = leaderstats
end)
-- כל דבר עם התג Kill מסיים חיים
local function killOnTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- מדרגה נעלמת דוהה זמן קצר אחרי שמישהו נוחת עליה, ואז חוזרת
local function makeVanish(part)
part.Touched:Connect(function(hit)
if part:GetAttribute("Gone") or not hit.Parent:FindFirstChild("Humanoid") then
return
end
part:SetAttribute("Gone", true)
task.wait(Settings.VanishDelay)
part.Transparency = 0.8
part.CanCollide = false
task.wait(Settings.VanishTime)
part.Transparency = 0
part.CanCollide = true
part:SetAttribute("Gone", nil)
end)
end
-- העצמים המסתובבים מסתובבים מעט בכל פריים
RunService.Heartbeat:Connect(function(dt)
for _, spinner in CollectionService:GetTagged("Spinner") do
if spinner:IsDescendantOf(workspace) then
spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0))
end
end
end)
-- הפעל את כל המכשולים בשלב לפי התגים שלהם
local function setupStage(stage)
for _, part in stage:GetDescendants() do
if part:HasTag("Kill") then
part.Touched:Connect(killOnTouch)
end
if part:HasTag("Vanish") then
makeVanish(part)
end
end
end
-- בחר שלב כלשהו באקראי
local function pickStage()
local all = stages:GetChildren()
return all[math.random(1, #all)]
end
-- הנח עותק של מודל בראש המגדל; הפונקציה מחזירה את העותק ואת הגובה החדש של ראש המגדל
local function stack(template, bottom)
local copy = template:Clone()
local box, size = copy:GetBoundingBox()
local lift = bottom - (box.Position.Y - size.Y / 2)
copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
copy.Parent = tower
return copy, bottom + size.Y
end
-- בנה מגדל אקראי חדש מלמטה למעלה
local function buildTower()
tower = Instance.new("Model")
tower.Name = "Tower"
tower.Parent = workspace
local top = 0
for i = 1, Settings.StageCount do
local stage, newTop = stack(pickStage(), top)
top = newTop
setupStage(stage)
end
stack(ServerStorage.Finish, top)
end
buildTower()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.