Sabuk Konveyor
Pelajaran 7 dari 18 dalam kursus Game Roblox: Menara Tanpa Akhir di Coddy.
Tahap Conveyor memiliki sabuk gelap bernama Conveyor yang mendorongmu kembali ke arah asalmu. Part yang di-anchor tidak pernah bergerak, tetapi jika kamu memberinya AssemblyLinearVelocity, apa pun yang berdiri di atasnya akan ikut terbawa, seperti pada sabuk sungguhan.
Ke arah mana? Setiap part memiliki sisi depan, dan part.CFrame.LookVector adalah Vector3 sepanjang satu stud yang mengarah ke luar part. Sabuk itu diputar sehingga sisi depannya menghadap kembali ke bawah jalan setapak:
part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeedMenggunakan arah part itu sendiri berarti pembuat dapat memutar sabuk ke arah mana pun dan sabuk itu tetap berfungsi, tanpa perlu mengubah skrip.
Tantangan
SedangDi setupStage, berikan setiap part dengan tag Conveyor nilai AssemblyLinearVelocity sebesar CFrame.LookVector dikalikan Settings.BeltSpeed.
Tekan Play dan berjalanlah melawan arah sabuk. Lalu tekan Periksa.
Coba sendiri
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")
-- Setiap pemain mendapat Wins di papan peringkat
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)
-- Apa pun yang diberi tag Kill mengakhiri satu nyawa
local function killOnTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- Pijakan yang menghilang memudar sesaat setelah seseorang menginjaknya, lalu muncul kembali
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
-- Spinner berputar sedikit setiap frame
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)
-- Aktifkan setiap rintangan dalam sebuah stage berdasarkan tag-nya
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
-- Pilih stage secara acak
local function pickStage()
local all = stages:GetChildren()
return all[math.random(1, #all)]
end
-- Letakkan salinan model di atas menara; kembalikan salinan dan posisi puncak yang baru
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
-- Bangun menara baru secara acak dari bawah ke atas
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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Game Roblox: Menara Tanpa Akhir
4Jadikan Ini Sebuah Permainan
Tahap di Papan PeringkatLatihan sendiri: Playground Roblox