Ora che hai un mondo 3D, è tempo di aggiungere il tuo primo script. In questa sezione, creerai una meccanica di raccolta delle monete che consente ai giocatori di raccogliere monete e disabilita temporaneamente le monete dopo che sono state raccolte.
Crea le monete
Prima di poter scriptare qualcosa, devi avere oggetti segnaposto nel mondo da usare come monete. Come le piattaforme delle scogliere marittime che hai creato nella sezione precedente, le monete possono essere semplici oggetti Part.
Crea le moneteIn Workspace > World, crea una nuova cartella chiamata Monete.All'interno della cartella Monete, crea un Part cilindrico chiamato Moneta con BrickColor impostato su Oro, Material impostato su Metallo, Dimensioni 0.6, 8, 4 e Orientamento 90, 0, 0.Disabilita CanCollide ed abilita Anchored.Poi duplica il Part Moneta più volte e distribuisci le copie intorno all'isola e sulle piattaforme affinché siano accessibili dai livelli delle scogliere marittime.Mantieni ogni copia chiamata Moneta.
Crea lo script
Successivamente, faremo in modo che le monete rispondano ai giocatori. Il motore Roblox può rilevare quando qualcosa tocca una moneta, ma devi utilizzare uno script per definire come la moneta dovrebbe reagire.
Crea CoinServiceIn ServerScriptService, crea uno Script chiamato CoinService con il seguente codice:```lua-- Inizializzazione di servizi e variabililocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- Definizione del gestore di eventilocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Il giocatore ha toccato una monetacoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Il giocatore ha raccolto la moneta")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Impostazione dei listener di eventifor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
Ora, ogni volta che un giocatore tocca una moneta, la moneta scompare per 10 secondi e il registro di output stampa Il giocatore ha raccolto la moneta.
Le seguenti sezioni descrivono come funziona lo script in modo più dettagliato.
Inizializza servizi e variabili
Come con gran parte del codice che probabilmente hai scritto in altre lingue, definisci variabili di cui hai bisogno in seguito nella parte superiore dello script. Il nostro codice fa quanto segue:
- Ottieni riferimenti a tutte le monete - Lo script poi interroga lo spazio di lavoro 3D per tutte le referenze agli oggetti moneta utilizzando il metodo GetChildren(). Questo metodo restituisce un array contenente tutto ciò che è genitore all'oggetto a cui è associato, che in questo caso è la cartella Workspace.World.Coins che hai creato in precedenza.
- Definisci una variabile globale - La variabile COOLDOWN viene utilizzata successivamente per definire quanto tempo disabilitare una moneta dopo che è stata raccolta.
Inizializzazione dei servizi e variabililocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
Definisci il gestore di eventi
Il motore Roblox simula fisicamente il mondo 3D e gestisce gran parte della logica per gestire eventi relativi al rendering, alla fisica e al networking. Quando sei interessato a scriptare la tua logica durante alcuni di questi eventi, puoi ascoltarli e gestirli, mentre lasci al motore il resto. In questo caso, ascolti e gestisci gli eventi relativi alle monete toccate. Lo script definisce la logica per gestire questo evento nel metodo onCoinTouched(), che fa quanto segue:
- Rileva se la moneta è abilitata - Ogni Instance ha un attributo booleano Enabled che definisce se l'oggetto esiste o meno nel mondo 3D. Puoi ottenere gli attributi delle istanze con il metodo GetAttribute().
- Rileva se un giocatore ha toccato la moneta - Se una moneta è abilitata, il metodo utilizza il servizio dei giocatori per controllare se l'oggetto che ha toccato la moneta era effettivamente un giocatore. Quando si verifica un evento di tocco, il motore Roblox passa l'oggetto che ha toccato la moneta come parametro otherPart. Lo script verifica se il genitore di otherPart appartiene a un giocatore.
- Disabilita la moneta se un giocatore la tocca e la riabilita dopo 10 secondi - Infine, se un giocatore ha toccato la moneta, il metodo disabilita la moneta, aspetta 10 secondi e poi riabilita la moneta per la raccolta. task.wait() è usato al posto di wait() perché fornisce migliori prestazioni non interrompendo completamente l'esecuzione del codice, consentendo nell'altro thread di eseguire altre attività contemporaneamente.
Definizione del gestore di eventi
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Il giocatore ha toccato una moneta
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Il giocatore ha raccolto la moneta")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
Collega il gestore di eventi
Tutti gli oggetti 3D simulati ereditano da BasePart e quindi hanno un evento Touched(). Il seguente ciclo collega il gestore onTouchedEvent() a ogni evento di contatto di una moneta facendo quanto segue:
- Scorri tutte le monete - Scorri ciascuna delle monete utilizzando un'iterazione generale.
- Collega il gestore all'evento - In ogni iterazione del ciclo, la moneta è abilitata per impostazione predefinita, quindi è visibile nel mondo 3D durante l'inizio iniziale del gioco. Il metodo del gestore onCoinTouched() è anche collegato all'evento Touched della moneta in modo che venga eseguito ogni volta che si verifica l'evento. Quando il motore rileva un contatto, passa anche l'oggetto che ha toccato l'oggetto, otherPart.
Collegare il gestore di eventi
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
Prova la meccanica
Seleziona Test dal menu a discesa e fai clic su Play. Muovi il tuo personaggio per toccare una moneta. Se tutto funziona, la moneta scompare, la finestra Output stampa Il giocatore ha raccolto la moneta, e la moneta riappare 10 secondi dopo.
