Menu
CoddyTech

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.BeltSpeed

Menggunakan arah part itu sendiri berarti pembuat dapat memutar sabuk ke arah mana pun dan sabuk itu tetap berfungsi, tanpa perlu mengubah skrip.

challenge icon

Tantangan

Sedang

Di 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()
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Roblox: Menara Tanpa Akhir

Latihan sendiri: Playground Roblox