Tutorial · Basi dello scripting

Come programmare in Roblox Studio: guida per principianti

Programmare (fare scripting) in Roblox Studio significa scrivere Luau, la versione di Roblox del linguaggio Lua, in script che aggiungi al tuo gioco. Questa guida parte da un Baseplate vuoto: apri la finestra Output, scrivi un primo script, cambi una parte dal codice, reagisci quando un giocatore calpesta una piattaforma e provi un LocalScript, e lungo la strada impari variabili, funzioni, istruzioni if, cicli ed eventi.

Aggiornato il 26 ottobre 202622 min di letturaScritto da

La risposta breve

Per programmare in Roblox Studio, passa il mouse su ServerScriptService nell'Explorer, clicca su + e inserisci uno Script. Studio lo apre nello Script Editor. Scrivi Luau, come print("Hello"), premi Play (F5) e leggi il risultato nella finestra Output (menu Window o scheda Script). Uno Script gira sul server e cambia le cose per tutti; un LocalScript in StarterPlayerScripts gira sul dispositivo di un solo giocatore.

  • Impara prima quattro idee: variabili (local coins = 3), funzioni (local function name() ... end), istruzioni if ed eventi (part.Touched:Connect(...)). I quattro script di questa guida si costruiscono con queste, più cicli e tabelle.
  • Usa task.wait(), non wait(). Il riferimento di Roblox indica il wait() globale come deprecato e sostituito da task.wait().
  • Nelle opzioni di visualizzazione della finestra Output, attiva Show Context così ogni riga dice se arriva dal Server o da un Client.
In questa pagina
  1. Prima di iniziare
  2. 1. Primo script
  3. 2. Cambiare una parte
  4. 3. Eventi
  5. 4. Primo LocalScript
  6. 5. Provare
  7. Dove vanno
  8. Leggere gli errori
  9. Tutorial vecchi
  10. Pratica
  11. Cosa viene dopo
  12. Errori comuni
  13. Con RoCode
  14. Domande frequenti
  15. Fonti e letture

Prima di iniziare: Studio, un Baseplate e la finestra Output

IllustrazioneI quattro script in un solo test: la parte di ColourChanger cambia colore ogni secondo, calpestare la Pad la rende gialla per 2 secondi per tutti i giocatori e mette il tuo nome nell'Output, ed E fa sfumare la Pad solo su questo schermo.

Ti servono Roblox Studio e un account Roblox, e nient'altro: niente editor di codice né plugin. Tutti gli script di questa guida si scrivono nello Script Editor di Studio.

  1. Installa Roblox Studio, l'app gratuita di Roblox per Windows e Mac, e accedi con il tuo account Roblox.
  2. Apri Studio. La sua pagina iniziale mostra dei modelli: scegli Baseplate. Ottieni un pavimento con una texture a griglia 4x4 e uno SpawnLocation, il punto dove appare il tuo avatar quando giochi.
  3. Se non vedi le finestre Explorer e Properties, aprile dal menu Window o dalla scheda Home. L'Explorer mostra ogni oggetto del tuo gioco; Properties mostra le impostazioni di quello che selezioni.
  4. Apri Output dal menu Window o dalla scheda Script. Lì compaiono i messaggi e gli errori dei tuoi script.
  5. Nelle opzioni di visualizzazione della finestra Output, attiva Show Context, che etichetta ogni messaggio come Client o Server, e Show Source, che mostra lo script e il numero di riga che l'ha prodotto.
I quattro script che scriverai
ScriptTipoDove vaCosa insegna
FirstScriptScriptServerScriptServiceVariabili, una funzione, un'istruzione if, cicli e una tabella
ColourChangerScriptDentro una Part in WorkspaceCambiare proprietà, script.Parent e un ciclo che aspetta
TouchPadScriptDentro una Part chiamata PadEventi, trovare il giocatore che ha toccato una parte e un debounce
MyFirstLocalScriptLocalScriptStarterPlayerScripts, dentro StarterPlayerCodice che gira sul dispositivo di un giocatore, pressioni dei tasti e cosa resta su quel dispositivo
L'Explorer alla fine (solo gli oggetti che usa questa guida)
Workspace
  Baseplate Part
  SpawnLocation SpawnLocation
  Part Part new
    ColourChanger Script new
  Pad Part new
    TouchPad Script new
ServerScriptService
  FirstScript Script new
StarterPlayer
  StarterPlayerScripts
    MyFirstLocalScript LocalScript new

Passo 1: scrivi il tuo primo script

  1. Nell'Explorer, passa il mouse su ServerScriptService, clicca sul pulsante + e scegli Script (la scorciatoia è Ctrl+I, o ⌘I su Mac). Studio crea lo script e lo apre nello Script Editor.
  2. Clicca col tasto destro sul nuovo script, scegli Rename e chiamalo FirstScript. Il nome non cambia quello che fa lo script, ma ti dice quale script ha stampato cosa.
  3. Gli script nuovi partono con una riga, print("Hello world!"). Cancellala e incolla il codice qui sotto.
  4. Premi Play (F5), con Test scelto nel menu a tendina alla sua sinistra. Studio avvia un test e mette il tuo avatar sullo SpawnLocation.
  5. Leggi le righe dell'Output e premi Stop (Shift+F5). Stop riporta anche ogni oggetto com'era prima di premere Play, quindi tutto quello che hai spostato o ricolorato mentre giocavi torna indietro.
Script in ServerScriptService chiamato FirstScript
-- Script in ServerScriptService chiamato FirstScript.
-- Il tuo primo Luau: variabili, una funzione, un'istruzione if, un ciclo e una tabella.
-- Premi Play (F5) e leggi i risultati nella finestra Output.

-- Una variabile è un nome che contiene un valore
local gameName = "Coin Run"
local coinsToWin = 3

-- Una funzione è un blocco di codice con un nome che puoi eseguire tutte le volte che vuoi.
-- name e goal sono i suoi parametri; return restituisce un valore a chi l'ha chiamata.
local function describe(name: string, goal: number): string
	return `{name}: collect {goal} coins to win`
end

print(describe(gameName, coinsToWin)) --> Coin Run: collect 3 coins to win

-- Un'istruzione if esegue codice solo quando la sua condizione è vera
if coinsToWin > 5 then
	print("That is a long game")
elseif coinsToWin > 1 then
	print("That is a short game")
else
	print("One coin and you win")
end

-- Un ciclo for ripete il codice un numero fisso di volte
for count = 1, coinsToWin do
	print("Coin number", count)
end

-- Una tabella contiene una lista di valori; questo ciclo li visita uno per uno in ordine
local colours = { "Red", "Green", "Blue" }
for position, colour in colours do
	print(position, colour) --> 1 Red, poi 2 Green, poi 3 Blue
end

Tutto quello che viene dopo -- su una riga è un commento: Luau lo salta, quindi puoi lasciarti delle note. I commenti --> mostrano cosa stampa quella riga.

L'Output dovrebbe mostrare queste otto righe, mescolate ai messaggi di Studio. Quando print riceve più di un valore, mette uno spazio tra loro. Con Show Context e Show Source attivi, ogni riga ha in più l'etichetta Server e FirstScript con un numero di riga.

Output (atteso)
Coin Run: collect 3 coins to win
That is a short game
Coin number 1
Coin number 2
Coin number 3
1 Red
2 Green
3 Blue

Collega ogni riga al codice che l'ha stampata. Più avanti farai lo stesso con i messaggi di errore, quindi conviene abituarsi da subito.

FirstScript usa solo Luau puro, senza oggetti di Roblox, quindi funziona anche nel Luau playground gratuito nel tuo browser. Cambia un valore lì e rieseguilo per vedere cosa cambia.

Cosa fa ogni parte di FirstScript
CodiceIdeaCosa significa
local gameName = "Coin Run"VariabileUn nome che contiene un valore. local significa che solo questo script, o il blocco in cui si trova, può usarla. Il testo tra virgolette è una string (stringa); 3 è un number (numero). I nomi distinguono le maiuscole, quindi coinsToWin e CoinsToWin sono due variabili diverse.
local function describe(name: string, goal: number): stringFunzioneUn blocco di codice con un nome che puoi eseguire tutte le volte che vuoi. name e goal sono i suoi parametri: valori che le vengono passati ogni volta che viene chiamata. : string e : number sono annotazioni di tipo facoltative. Luau le usa per avvisarti degli errori nello Script Editor; il codice funziona uguale anche senza.
returnValore di ritornoRestituisce un valore al codice che ha chiamato la funzione. print(describe(gameName, coinsToWin)) stampa quello che restituisce describe.
`{name}: collect {goal} coins to win`Interpolazione di stringheIl testo tra backtick può contenere valori: Luau sostituisce {name} e {goal} con i loro valori attuali.
if, elseif, else, endIstruzione ifLuau prova le condizioni dall'alto in basso ed esegue solo la prima che è vera. coinsToWin vale 3, che non è più di 5 ma è più di 1, quindi viene stampato solo "That is a short game".
for count = 1, coinsToWin doCiclo for numericoEsegue il codice al suo interno una volta per ogni numero da 1 a coinsToWin, con count che vale 1, poi 2, poi 3.
{ "Red", "Green", "Blue" } e for position, colour in colours doTabella e cicloUna tabella usata come lista, quello che Luau chiama un array. Le posizioni partono da 1, non da 0. Il ciclo visita ogni elemento e ti dà la sua posizione e il suo valore.

Ogni blocco che inizia con function, if, for o while si chiude con end. Basta un solo end mancante per impedire che tutto lo script venga eseguito; leggere gli errori mostra il messaggio che ricevi.

Passo 2: cambia una parte da uno script

Gli script diventano utili quando cambiano le cose nel mondo. Le impostazioni che vedi nella finestra Properties, come Color, Transparency o Anchored di una parte, sono proprietà, e anche uno script può cambiarle.

  1. Nella scheda Home, clicca su Part. Studio aggiunge un blocco al Workspace. Il suo nome non importa.
  2. Nell'Explorer, passa il mouse sulla nuova parte, clicca su + e inserisci uno Script. Chiamalo ColourChanger e sostituisci il suo contenuto con il codice qui sotto.
  3. Premi Play. La parte diventa rossa, poi blu, poi verde, cambiando una volta al secondo, e ricomincia.
Script in una Part del Workspace chiamato ColourChanger
-- Script dentro una Part in Workspace, chiamato ColourChanger.
-- Gli script cambiano le stesse proprietà che vedi nella finestra Properties.
-- Questo dà alla sua parte un colore nuovo ogni secondo, per tutti i giocatori.

local part = script.Parent :: BasePart -- la parte dentro cui si trova questo script

local colours = {
	Color3.fromRGB(255, 85, 85), -- rosso
	Color3.fromRGB(85, 170, 255), -- blu
	Color3.fromRGB(85, 255, 127), -- verde
}

part.Anchored = true -- una parte ancorata resta dove la metti

local index = 1
while true do
	part.Color = colours[index]
	index = index % #colours + 1 -- 1, 2, 3 e di nuovo 1
	task.wait(1) -- pausa di un secondo (il vecchio wait() è deprecato)
end
  • script.Parent è l'oggetto dentro cui si trova lo script, qui la parte. Trascina lo script in un'altra parte e cambierà quella al suo posto.
  • :: BasePart è una conversione di tipo (type cast). Dice allo Script Editor che il parent è una parte, così può controllare le proprietà che usi su di essa. Luau usa i tipi solo per avvisi e suggerimenti, quindi la conversione non cambia quello che fa la riga.
  • part.Color e part.Anchored sono le stesse proprietà che vedi nella finestra Properties, con gli stessi nomi. Roblox usa l'ortografia americana, quindi la proprietà è Color anche se questo script si chiama ColourChanger.
  • Anchored = true tiene ferma la parte: il riferimento di Roblox dice che una parte ancorata non si muove mai per gravità, collisioni o qualsiasi altra fisica.
  • colours[index] legge un elemento della lista. #colours è la lunghezza della lista, 3, e % dà il resto della divisione, quindi index % #colours + 1 conta 1, 2, 3, 1, 2, 3.
  • while true do si ripete per sempre, ed è per questo che conta il task.wait(1) al suo interno. La documentazione di Roblox dice di mettere sempre una pausa come task.wait() in un ciclo infinito: senza, il gioco si blocca e Studio si pianta.

ColourChanger è uno Script, quindi gira sul server, e tutti i giocatori nel gioco vedono lo stesso colore nello stesso momento. Il passo 4 mostra l'altro tipo di script.

Passo 3: reagisci a un giocatore con un evento

La maggior parte del codice di un gioco aspetta che succeda qualcosa: un giocatore entra, una parte viene toccata, si clicca un pulsante. Roblox li chiama eventi. Per eseguire codice quando uno scatta, gli colleghi una funzione.

  1. Inserisci un'altra Part e chiamala esattamente Pad, con la P maiuscola. Lasciala direttamente nel Workspace, non dentro una cartella o un modello, perché il LocalScript del passo 4 la cerca lì.
  2. Trasformala in una piattaforma piatta su cui puoi salire, per esempio impostando la sua Size a 6, 1, 6 nella finestra Properties. Spostala sul pavimento vicino allo SpawnLocation e spunta Anchored così non si muove.
  3. Passa il mouse su Pad, clicca su +, inserisci uno Script, chiamalo TouchPad e incolla il codice qui sotto.
  4. Premi Play e sali sulla piattaforma. Diventa gialla per 2 secondi, e l'Output dice il tuo nome.
Script in Workspace.Pad chiamato TouchPad
-- Script dentro una Part in Workspace chiamata Pad, script chiamato TouchPad.
-- Eventi: quando un giocatore sale sulla piattaforma, si illumina di giallo e l'Output dice chi è stato.
-- Un debounce evita che venga eseguito molte volte al secondo mentre ci sta sopra.

local Players = game:GetService("Players")

local pad = script.Parent :: BasePart
local COOLDOWN_SECONDS = 2

local normalColour = pad.Color
local busy = false

local function onTouched(otherPart: BasePart)
	if busy then
		return -- ancora in attesa dall'ultimo tocco
	end
	-- Il personaggio è il Model che contiene la parte del corpo (o il cappello) che ha toccato
	local character = otherPart:FindFirstAncestorOfClass("Model")
	local player = character and Players:GetPlayerFromCharacter(character)
	if not player then
		return -- l'ha toccata una parte sciolta o un NPC, non un giocatore
	end

	busy = true
	print(`{player.Name} stepped on the pad`)
	pad.Color = Color3.fromRGB(255, 220, 0)
	task.wait(COOLDOWN_SECONDS)
	pad.Color = normalColour
	busy = false
end

pad.Touched:Connect(onTouched)
Come TouchPad passa da un tocco a un giocatore
CodiceCosa fa
pad.Touched:Connect(onTouched)Collega la funzione all'evento Touched della piattaforma, così Roblox esegue onTouched ogni volta che qualcosa la tocca, e le passa la parte che l'ha toccata.
otherPartLa parte che ha toccato la piattaforma: un piede, una gamba, l'impugnatura di un cappello o uno strumento che il giocatore tiene in mano. Non è mai il giocatore, quindi le due righe successive scoprono di chi è.
otherPart:FindFirstAncestorOfClass("Model")Risale da quella parte fino al primo antenato la cui classe è esattamente Model, cioè il personaggio. Siccome il nome della classe deve coincidere esattamente, salta un cappello (classe Accessory) e uno strumento in mano (classe Tool).
Players:GetPlayerFromCharacter(character)Restituisce il Player a cui appartiene quel modello come personaggio, oppure nil se non è il personaggio di nessuno, come un NPC. Il character and davanti salta la chiamata quando non è stato trovato nessun modello, e così player resta nil.
if not player then return endSi ferma qui per tutto ciò che non è un giocatore. return esce prima dalla funzione.

Perché la piattaforma ha bisogno di un debounce

La pagina sul debounce di Roblox avverte che Touched scatta più volte di fila quando le parti entrano in contatto, e un personaggio che cammina ha diverse parti del corpo. Senza un controllo, un solo passo sulla piattaforma potrebbe stampare molte righe e far ripartire il bagliore giallo più e più volte.

La variabile busy è il debounce. Il primo tocco la imposta a true, e ogni tocco nei 2 secondi successivi arriva a if busy then return end e si ferma. Dopo task.wait(COOLDOWN_SECONDS) la piattaforma torna al suo colore e busy torna a false. COOLDOWN_SECONDS è in maiuscolo perché è un'impostazione che non cambia mentre il gioco gira, la convenzione che Roblox suggerisce per le costanti.

Questa piattaforma ha un solo debounce per tutti, quindi un secondo giocatore che ci sale in quei 2 secondi viene ignorato. Per una piattaforma che si illumina va bene. Una piattaforma che dà ricompense dovrebbe avere un'attesa per ogni giocatore, come fa la piattaforma delle monete della guida alla leaderboard (in inglese).

Passo 4: il tuo primo LocalScript, e perché è diverso

Un gioco in esecuzione è un server più un client per ogni giocatore. Tutto quello che hai visto finora era uno Script, che gira sul server, quindi le sue modifiche arrivano a tutti i giocatori. Un LocalScript, invece, gira sul dispositivo di un solo giocatore. Pressioni dei tasti, telecamera e menu sullo schermo si gestiscono lì, perché solo quel dispositivo li conosce.

  1. Nell'Explorer, espandi StarterPlayer, passa il mouse su StarterPlayerScripts, clicca su + e inserisci un LocalScript. Chiamalo MyFirstLocalScript e incolla il codice qui sotto.
  2. Premi Play. L'Output mostra Hello, e il tuo nome, con l'etichetta Client.
  3. Clicca nella vista del gioco e premi E. La piattaforma sfuma. Premi di nuovo E per riaverla.
  4. Con il test ancora in corso, clicca sull'interruttore Client/Server nei controlli di test di Studio per passare alla copia del gioco del server. Lì la piattaforma è solida: il server non ha mai saputo della modifica.
LocalScript in StarterPlayerScripts chiamato MyFirstLocalScript
-- LocalScript in StarterPlayer > StarterPlayerScripts chiamato MyFirstLocalScript.
-- Un LocalScript gira sul dispositivo di un giocatore. Premi E: la Pad sfuma solo sul tuo
-- schermo, perché una modifica a una parte fatta qui non arriva al server né a nessun altro.

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")

local player = Players.LocalPlayer
print(`Hello, {player.Name}`) -- compare nell'Output, segnato come Client

UserInputService.InputBegan:Connect(function(input: InputObject, gameProcessed: boolean)
	if gameProcessed then
		return -- il tasto è stato usato per altro, come scrivere in chat
	end
	if input.KeyCode == Enum.KeyCode.E then
		local pad = workspace:FindFirstChild("Pad")
		if pad and pad:IsA("BasePart") then
			pad.Transparency = if pad.Transparency == 0 then 0.6 else 0
		end
	end
end)
  • Players.LocalPlayer è il giocatore il cui dispositivo esegue lo script. Roblox lo imposta solo per i LocalScript e i ModuleScript che questi richiedono, quindi il codice del server non può usarlo.
  • UserInputService.InputBegan scatta quando il giocatore inizia a premere un tasto, a cliccare o a toccare lo schermo. gameProcessed è true quando il motore ha già usato quell'input, per esempio un clic su un pulsante o un tasto scritto nella barra della chat, quindi lo script lo ignora.
  • workspace:FindFirstChild("Pad") restituisce il figlio chiamato Pad, oppure nil se non ce n'è nessuno. pad:IsA("BasePart") controlla che sia davvero una parte prima che lo script cambi la sua Transparency.
  • if pad.Transparency == 0 then 0.6 else 0 è un'espressione if: sceglie uno tra due valori. Una Transparency di 0 è del tutto visibile e 1 è invisibile.
  • Uno script per lo scatto con Shift (in inglese) è un buon secondo LocalScript: ascolta un tasto e cambia la WalkSpeed del tuo personaggio.
Script, LocalScript e ModuleScript
TipoGira suLe sue modifiche arrivano aUsalo perDi solito va in
ScriptIl serverTutti i giocatoriRegole del gioco: monete, danni, porte, round, salvataggioServerScriptService, o dentro una parte mentre impari
LocalScriptIl dispositivo di un giocatoreSolo quel dispositivo, tranne il movimento del suo personaggioInput, la telecamera, menu sullo schermo, effetti per un giocatoreStarterPlayerScripts o StarterGui
ModuleScriptIl lato che lo chiama con require()Lo stesso dello script che l'ha richiestoCodice condiviso da più scriptReplicatedStorage per entrambi i lati, ServerScriptService solo per il server

Cosa può cambiare un imbroglione

Dai per scontato che un imbroglione controlli tutto sul suo dispositivo. Può eseguire i suoi LocalScript e modificare i tuoi, quindi può far sfumare la piattaforma, o qualsiasi altra cosa, sul suo schermo. Qui è innocuo: la sfumatura è solo visiva e resta sul suo dispositivo. È anche il motivo per cui tutto ciò che conta lo decide uno Script sul server.

Nemmeno uno Script sul server è sicuro in automatico. TouchPad gira sul server, ma il dispositivo di ogni giocatore controlla la fisica del suo personaggio, e la documentazione di Roblox sulla sicurezza include il manipolare quando scatta Touched, o impedire che scatti, tra le cose che un client può fare con le parti che controlla. Per una piattaforma che si illumina non importa. Per una che paga, controlla anche qualcosa che il server gestisce da solo, come la regola della guida all'obby (in inglese) secondo cui i checkpoint contano solo in ordine.

Passo 5: prova i quattro script insieme

  1. Pulisci l'Output con Ctrl+K (⌘K su Mac) e premi Play (F5). L'Output mostra le otto righe di FirstScript con l'etichetta Server, e la tua riga Hello con l'etichetta Client. La parte di ColourChanger cambia colore ogni secondo.
  2. Sali sulla piattaforma. Diventa gialla per 2 secondi e l'Output mostra il tuo nome e "stepped on the pad" una volta. Continua a camminarci sopra: compare una nuova riga al massimo una volta ogni 2 secondi, non ogni volta che scatta Touched.
  3. Premi E. La piattaforma sfuma fino a una Transparency di 0.6. Premi di nuovo E ed è solida.
  4. Premi Stop. Nel menu a tendina dei test scegli Server & Clients, imposta 2 client e premi Play (o F7). Studio apre una finestra server e due finestre client. In un client premi E: lì la piattaforma sfuma, mentre l'altro client e il server continuano a vederla solida. Premi End Session quando hai finito.
  5. Rompi qualcosa apposta. Cambia il nome di Pad in Pad2 e gioca. Salirci sopra la fa ancora diventare gialla, perché TouchPad trova la sua parte con script.Parent, non per nome. Premere E adesso non fa niente, e non c'è nessun errore: FindFirstChild("Pad") ha restituito nil, e il controllo if pad and ... ha saltato il resto senza dire nulla. Aggiungi print(pad) nella riga dopo FindFirstChild, gioca e premi E: l'Output mostra nil. Un print così è il modo più veloce per capire perché uno script non fa nulla. Premi Stop, cancella la riga del print e richiama la parte Pad.

Dove vanno gli script

Dove si trova uno script decide se verrà eseguito, e Studio non ti avvisa quando non succederà mai. Per gli script che scriverai dopo:

Dove mettere ogni tipo di script
ContenitoreMetticiPerché
ServerScriptServiceScript con la maggior parte delle regole del tuo gioco: ricompense, round, salvataggioGirano sul server, e niente di ServerScriptService viene inviato ai giocatori.
Dentro una parte in WorkspaceUno Script che appartiene a quella parte, come ColourChanger e TouchPadVa bene mentre impari: la parte è script.Parent. Per progetti veri, Roblox consiglia di etichettare le parti (vedi sotto).
StarterPlayerScripts, dentro StarterPlayerLa maggior parte dei LocalScript: input, la telecamera, effetti per un giocatoreOgni giocatore riceve la sua copia quando entra.
StarterGuiLocalScript dentro una ScreenGui che gestiscono un menu sullo schermoOgni giocatore riceve la sua copia dell'interfaccia.
ReplicatedStorageModuleScript richiesti sia dal codice del server sia da quello del clientEntrambi i lati possono vederlo. Un LocalScript, o uno Script con le impostazioni di default, messo qui non viene mai eseguito.

La pagina di Roblox sulle posizioni degli script consiglia di non mettere script direttamente dentro le parti in Workspace: etichetta le parti e gestiscile da un unico ModuleScript usando CollectionService. Uno script dentro una parte resta comunque il modo più facile per iniziare, e va bene per uno o due oggetti mentre impari. La guida alle porte mostra lo schema con le etichette, con un solo script per tutte le porte, e la guida a client e server (entrambe in inglese) ha la tabella completa di quali contenitori eseguono quali script.

Quando qualcosa va storto: leggi l'Output

Gli errori compaiono in rosso nell'Output. Ognuno inizia con dove è successo, il nome completo dello script e il numero di riga, e poi dice cosa è andato storto. Clicca sull'errore e Studio apre quello script a quella riga. Per esempio, se cancellassi il controllo if not player da TouchPad e una parte sciolta cadesse sulla piattaforma, l'Output mostrerebbe:

Output (esempio)
Workspace.Pad.TouchPad:22: attempt to index nil with 'Name'

Gli errori nel modo in cui è scritto il codice, come un end mancante, compaiono prima di premere Play: lo Script Editor li sottolinea in rosso, e la finestra Script Analysis (il pulsante Analysis nella scheda Script) li elenca. Uno script con uno di questi errori non viene eseguito per niente, nemmeno le righe che vengono prima.

Tre errori che conviene riconoscere
MessaggioCosa significaSoluzione
Colour is not a valid member of Part "Workspace.Part"Non esiste niente con quel nome esatto su quell'oggetto. Qui la proprietà si scrive Color.Copia l'ortografia e le maiuscole dalla finestra Properties o dall'Explorer. Di più su questo errore.
attempt to index nil with 'Name'Il codice ha letto qualcosa, qui .Name, da un valore che era nil. Nell'esempio sopra, player era nil perché una parte sciolta ha toccato la piattaforma.Scopri perché il valore è nil, e controllalo con if prima di usarlo. Di più su questo errore.
Expected 'end' (to close 'then' at line 2), got <eof>L'if alla riga 2 non ha il suo end. Per una funzione il messaggio dice to close 'function', e <eof> significa la fine del file.Aggiungi l'end mancante, guardando la riga indicata tra parentesi e non l'ultima. A volte il messaggio finisce con "did you forget to close ... at line N?". Quella parte è un'ipotesi di Luau basata sulla tua indentazione e può indicare il blocco sbagliato, quindi controlla prima la riga tra parentesi. Di più sugli errori di sintassi.

Quando uno script non fa nulla e nemmeno l'Output mostra nulla, di solito si trova in un posto dove non viene mai eseguito, oppure aspetta un evento che non scatta mai. La guida agli errori degli script (in inglese) ha una lista per gli script silenziosi e approfondisce come leggere l'Output.

Cosa fanno di diverso i vecchi tutorial di scripting

Se impari anche con video e post nei forum, troverai schemi vecchi. Questi sono quelli che contano, con il motivo per cui ognuno è un problema.

Schemi dei vecchi tutorial, e cosa fa invece questa guida
Il tutorialIl problemaQuesta guida
Fa le pause con wait(1)Il riferimento di Roblox indica il wait() globale come deprecato e dice che task.wait() l'ha sostituito.task.wait(1)
Trova il personaggio con otherPart.Parent, come fa la lezione sulla lava di RobloxQuando un cappello o uno strumento in mano tocca la parte, otherPart.Parent è l'Accessory o il Tool, non il personaggio, quindi non si trova nessun Humanoid e quel tocco va perso.FindFirstAncestorOfClass("Model"), e poi GetPlayerFromCharacter
Usa Touched senza debounceTouched scatta più volte di fila per un solo passo, quindi il codice viene eseguito ancora e ancora.Una variabile busy e un'attesa
Mette un LocalScript dentro una parte in WorkspaceLì un LocalScript non viene mai eseguito. Funziona solo da posti che appartengono a un giocatore.LocalScript in StarterPlayerScripts (perché)
Scrive part.Touched:connect(...) o table.getn(list)La guida di Roblox sui nomi dice che le API in camelCase sono per lo più deprecate, e il riferimento include solo Connect. table.getn è deprecato a favore di #list.:Connect(...) e #list
Cambia le monete o fa danni in un LocalScriptLa modifica resta sul dispositivo di quel giocatore, quindi nessun altro la vede e il server non la conta mai.Regole del gioco in Script sul server

Pratica: tre modifiche da provare

Cambiare il codice insegna più che leggerlo. Prova queste nel tuo gioco, una alla volta, e premi Play dopo ognuna.

  • Fai dare un punto alla piattaforma. Aggiungi lo script Leaderstats del passo 1 della guida alla leaderboard (in inglese). Poi in TouchPad, dopo busy = true, cerca la cartella leaderstats del giocatore e aggiungi 1 al suo valore Coins. Suggerimento: player:FindFirstChild("leaderstats"), poi leaderstats:FindFirstChild("Coins"), poi coins.Value += 1. La piattaforma delle monete della guida alla leaderboard ne è una versione finita, con un'attesa per ogni giocatore.
  • Fai sfumare anche il cambia colore. Fai in modo che ColourChanger cambi anche la Transparency della parte ogni secondo. Suggerimento: aggiungi una seconda tabella di numeri tra 0 e 1, come { 0, 0.3, 0.6 }, e imposta part.Transparency da questa nella riga dopo part.Color, usando lo stesso index.
  • Stampa il colore della piattaforma. Fai in modo che MyFirstLocalScript stampi il Color della piattaforma quando premi E. Suggerimento: print(pad.Color) dentro il blocco if pad and pad:IsA("BasePart"). Premi E mentre la piattaforma è gialla: il client vede il colore impostato dal server, perché le modifiche fatte sul server arrivano a tutti i client.

Cosa imparare dopo

Hai già usato i pezzi con cui si costruisce la maggior parte degli script dei giochi. Un buon ordine per quello che viene dopo:

  1. LocalScript vs Script vs ModuleScript: dove gira ogni tipo di script e cosa può cambiare, più nel dettaglio del passo 4.
  2. RemoteEvents: come un LocalScript chiede al server di fare qualcosa, e come il server controlla la richiesta.
  3. Una classifica: le tue prime statistiche, create e modificate sul server.
  4. Il tuo primo gioco: un breve percorso con lava, monete e un traguardo, gestito da due script server, e poi pubblicato.
  5. Poi scegli un sistema da aggiungere: un negozio con GUI, un sistema di round, dei checkpoint per obby, una schermata di caricamento o un'animazione alla pressione di un tasto. Quando qualcosa si rompe, la guida agli errori degli script ti aiuta a leggere il messaggio. Queste guide sono in inglese.

I tutorial Coding fundamentals di Roblox (in inglese) sono un buon complemento: sei serie che vanno da variabili e funzioni a condizioni, cicli, array e dizionari, fino a organizzare il codice con i ModuleScript, con piccoli progetti da costruire in Studio.

Errori comuni e soluzioni

La maggior parte dei problemi con un primo script è un nome che non coincide, uno script nel posto sbagliato o un ciclo senza attesa. Tieni aperto l'Output mentre provi.

Studio si blocca o smette di rispondere quando premo Play

Un ciclo while true do non ha nessuna attesa al suo interno, quindi nient'altro riesce a girare. La documentazione di Roblox dice che un ciclo infinito senza una pausa come task.wait() blocca il gioco e fa piantare Studio. Metti un task.wait() dentro ogni ciclo che si ripete per sempre, come fa ColourChanger.

Non succede nulla quando salgo sulla piattaforma

Controlla che TouchPad sia uno Script, non un LocalScript, direttamente dentro la parte Pad, che non sia disattivato e che la proprietà CanTouch della piattaforma sia spuntata. Poi metti print("touched", otherPart.Name) come prima riga dentro onTouched. Se non viene mai stampato, l'evento non scatta; se viene stampato, il problema è più in basso.

Premere E non fa nulla

MyFirstLocalScript deve essere un LocalScript dentro StarterPlayerScripts: un LocalScript in Workspace o in ServerScriptService non viene mai eseguito. La parte deve chiamarsi esattamente Pad e stare direttamente nel Workspace. Clicca prima nella vista del gioco, e assicurati di non stare scrivendo in chat, perché lo script ignora i tasti che il gioco ha già usato.

La parte cambia sul mio schermo ma non per gli altri giocatori

La modifica è stata fatta in un LocalScript, quindi è rimasta sul tuo dispositivo. Falla in uno Script sul server, oppure fai in modo che il LocalScript la chieda al server con un RemoteEvent.

ColourChanger funziona dentro una parte ma dà errore in ServerScriptService

Usa script.Parent come sua parte. In ServerScriptService il parent è ServerScriptService, che non ha Anchored né Color, quindi l'Output mostra un errore "not a valid member". Lascialo dentro la parte, oppure dai un nome alla parte e cercala con quel nome, per esempio local part = workspace:WaitForChild("ColourPart") :: BasePart.

L'Output non mostra nulla

Controlla che la finestra Output sia aperta (menu Window o scheda Script) e che non ci siano filtri: l'Output si può filtrare per tipo di messaggio, per Client o Server e per testo. Se è aperta e resta vuota, probabilmente lo script non è mai stato eseguito. Guarda la lista per gli script che non fanno nulla (in inglese).

Sbloccarti con RoCode

Se ti blocchi con uno script nel tuo gioco, RoCode può leggerlo con te. RoCode è un agente IA indipendente per Roblox Studio, non è fatto da Roblox: scrivi in una chat web e il suo plugin per Studio crea e modifica gli script nel tuo Explorer.

Mentre impari, la modalità utile è Ask: gli script continui a scriverli tu, e RoCode legge quello che c'è già e risponde alle tue domande.

Tu scrivi

Spiegami riga per riga cosa fa lo script TouchPad che si trova dentro la parte Pad, e dimmi perché usa un debounce.

RoCode fa
  • In modalità Ask usa solo strumenti di lettura come Search Scripts e Read Script, e non cambia nulla nel gioco
  • Se qualcosa va corretto, dice cosa cambierebbe e dove, e suggerisce di passare a Build
  • In Build modifica gli script sul posto e controlla con Check Script che ognuno compili. È un controllo di compilazione, non dei tipi né un test di gioco
  • Legge l'Output di Studio con il suo strumento Check Output, comprese le righe Server e Client del tuo ultimo test, anche dopo aver premuto Stop

In modalità Build con il plugin 3.9 o successivo, RoCode può fare un breve test e leggere gli errori, e con il plugin 3.9.11 o successivo guidare un personaggio di prova per verificare che il gioco funzioni, ma non fa screenshot mentre il gioco gira, quindi sulla piattaforma continui a salire tu. Come si collega RoCode a Studio.

Domande frequenti

Dove scrivo gli script in Roblox Studio?

Nell'Explorer, passa il mouse su un contenitore come ServerScriptService, clicca sul pulsante + e scegli Script. Studio lo apre nello Script Editor, dove scrivi Luau. Gli script server di solito vanno in ServerScriptService; i LocalScript vanno in StarterPlayerScripts o StarterGui.

Come eseguo uno script in Roblox Studio?

Premi Play (F5). Studio avvia un test, e ogni Script attivo in ServerScriptService o Workspace viene eseguito appena parte il gioco; i LocalScript in StarterPlayerScripts vengono eseguiti quando entri nel test. Run (sceglilo nel menu a tendina accanto a Play, o premi F8) avvia il gioco senza il tuo avatar, quindi per questa guida usa Play. Premi Stop (Shift+F5) per terminare il test. Per aprire uno script che hai già, fai doppio clic su di esso nell'Explorer.

Che linguaggio di programmazione usa Roblox?

Luau. Roblox lo descrive come un linguaggio di scripting veloce, piccolo, sicuro e con tipizzazione graduale, derivato da Lua 5.1, quindi la maggior parte dei tutorial su Lua è ancora utile. Luau aggiunge funzioni come l'interpolazione di stringhe con i backtick e le annotazioni di tipo facoltative, e Roblox aggiunge le sue librerie e i suoi oggetti, come task.wait.

Che differenza c'è tra uno Script e un LocalScript?

Uno Script gira sul server, e le sue modifiche arrivano a tutti i giocatori. Un LocalScript gira sul dispositivo di un giocatore, per cose come input, telecamera e menu sullo schermo, e le sue modifiche a parti, valori e interfaccia restano su quel dispositivo. La guida a client e server (in inglese) copre entrambi, più i ModuleScript.

Posso programmare in Roblox Studio su un telefono o un iPad?

La pagina di configurazione di Roblox descrive Studio come un'app gratuita per Windows e Mac e non indica nessuna versione per telefono o tablet, quindi ti serve un computer per scrivere script.

Perché il mio script non fa nulla e non mostra nessun errore?

Di solito si trova in un posto dove quel tipo di script non viene eseguito (un LocalScript in Workspace, o uno Script in StarterPlayerScripts), è disattivato, oppure l'evento che aspetta non scatta mai. La guida agli errori degli script ha una checklist (in inglese).

Quanto ci vuole per imparare a programmare su Roblox?

Nessuno può darti un numero onesto: dipende da quanto costruisci. Quello che aiuta di più è scrivere spesso piccoli script nel tuo gioco. Modifica i quattro script di questa guida, prova gli esercizi, poi segui la guida al tuo primo gioco e aggiungi un sistema alla volta.

Fonti e letture

Come è stato controllato il codice: ogni script di questa pagina supera il controllo dei tipi rigoroso di Luau con le definizioni dell'API di Roblox (luau-lsp, 26 ottobre 2026). Il controllo dei tipi trova API scritte male e tipi sbagliati, non la logica del gioco, quindi provalo in Studio prima di pubblicare.

Prova RoCode nel tuo gioco.

Crediti gratis ogni giorno, senza carta. Installa il plugin, descrivi la funzione e controlla cosa compare in Studio.