Menu
CoddyTech

Nastri trasportatori

Lezione 7 di 18 del corso Gioco Roblox: Torre infinita di Coddy.

La fase Conveyor ha un nastro scuro, contrassegnato con Conveyor, che ti spinge indietro nella direzione da cui sei arrivato. Una parte ancorata non si muove, ma assegnale una AssemblyLinearVelocity e tutto ciò che vi si trova sopra viene trasportato, come su un vero nastro.

In che direzione? Ogni parte ha un fronte e part.CFrame.LookVector è un Vector3 lungo uno stud che punta verso l'esterno. Il nastro è stato ruotato in modo che il suo fronte sia rivolto verso il fondo del passaggio:

part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeed

Usare la direzione propria della parte permette a chi costruisce di ruotare il nastro in qualsiasi direzione e farlo funzionare comunque, senza modificare lo script.

challenge icon

Sfida

Medio

In setupStage, assegna a ogni parte contrassegnata con Conveyor una AssemblyLinearVelocity pari al suo CFrame.LookVector moltiplicato per Settings.BeltSpeed.

Premi Play e cammina contro il nastro. Poi Verifica.

Provalo tu

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")

-- Ogni giocatore riceve Wins nella classifica
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)

-- Qualsiasi elemento con il tag Kill pone fine a una vita
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Un gradino che scompare diventa trasparente poco dopo che qualcuno ci atterra sopra, poi riappare
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

-- Gli elementi rotanti girano un po’ a ogni 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)

-- Attiva ogni ostacolo di una fase in base ai suoi tag
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

-- Scegli una fase a caso
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- Metti una copia di un modello in cima alla torre; restituisce la copia e la nuova altezza massima
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

-- Costruisci una nuova torre casuale, dal basso verso l’alto
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Roblox: Torre infinita