Ora che hai un Mondo3D, questa sezione del tutorial ti insegna come aggiungere il tuo primo script per definire una meccanica di raccolta delle monete.Questa meccanica consente ai giocatori di raccogliere monete e disabilita la raccolta di una moneta se è stata raccolta di recente.
Crea le monete
Prima di poter scriptare qualcosa, devi avere oggetti di riempimento nel mondo da utilizzare come monete.Come le piattaforme di stack del mare che hai fatto nella sezione precedente, le monete possono essere semplici oggetti Part .
Per creare le monete:
Nella finestra Explorer , aggiungi una nuova cartella nella cartella Mondo , quindi rinominala Monete .
Inserisci una parte cilindro nella cartella Monete , quindi rinomina la parte a Monete .
Seleziona la parte, quindi nella finestra Proprietà ,
- Imposta BrickColor a Oro .
- Imposta Materiale a Metallo .
- Imposta Dimensione a 0.6, 8, 4.
- Disabilita CanCollide .Questo dice al motore che altre parti possono passare attraverso la moneta, cioè i giocatori possono camminare attraverso le monete per raccoglierle.
- Abilita Ancorato .Questo dice al motore di non cambiare mai la posizione della moneta a causa di qualsiasi simulazione legata alla fisica, il che significa che i giocatori possono toccare la moneta senza influenzare la sua posizione.
Duplica un paio di monete in più e posizionali intorno alla mappa per scopi di test.
Le tue parti cilindriche ora sembrano monete e impediscono la simulazione della fisica, ma devi aggiungere logica alle monete in modo che i giocatori possano raccoglierle.
Crea il script
Per avere le monete da collezionare, vuoi reagire ai giocatori che le toccano.Il motore Roblox può notificarti quando qualcosa tocca una moneta, ma devi dichiararlo in uno script.Per creare uno script:
Nella finestra Explorer , passa il mouse su ServerScriptService e fai clic sul pulsante ⊕ . Un menu contestuale viene visualizzato.
Dal menu contestuale, seleziona Script .Un nuovo script viene visualizzato sotto ServerScriptService , che dice al motore di eseguire lo script sul Servere impedisce ai client di accedere al codice.
Rinomina lo script a CoinService .
Sostituisci il codice predefinito con il seguente codice:
-- Inizializzazione dei servizi e delle variabililocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- Definire il gestore 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("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Configurazione dei lettori di eventifor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endOra, ogni volta che un giocatore tocca una moneta, la moneta scompare per 10 secondi e il registro di output mostra Player collected coin .
Spiegazione del codiceLe seguenti sezioni descrivono come funziona lo script in dettaglio.
Inizializza servizi e variabili
Come con un sacco di codice che probabilmente hai scritto in altre lingue, definisci le variabili di cui hai bisogno in seguito in cima allo script.Il nostro codice fa quanto Seguendo:
Ottieni istanze di servizio - I servizi Roblox forniscono funzionalità integrate per caratteristiche comuni.Lo script ottiene prima le istanze del servizio Workspace , che contiene ogni oggetto nel Mondo3D, e il servizio Player , che gestisce e contiene tutti i giocatori connessi alla tua esperienza.
Ottieni riferimenti a tutte le monete - Lo script quindi interroga lo spazio di lavoro 3D per tutti i riferimenti agli oggetti delle monete con il metodo GetChildren().Questo metodo restituisce un array che contiene tutto ciò che è parented all'oggetto con cui è associato, che in questo caso è la cartella Workspace.World.Coins che hai creato in precedenza.
Definisce una variabile globale - La variabile COOLDOWN viene utilizzata in seguito per definire per quanto tempo disabilitare una moneta dopo che è stata raccolta.
Inizializzazione dei servizi e delle variabililocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
Definisci il gestore eventi
Il motore Roblox simula fisicamente il mondo 3D e gestisce molta della logica per gestire eventi relativi a rendering, fisica e networking.Quando sei interessato a scriptare la tua logica durante alcuni di questi eventi, puoi ascoltare e gestire loro, mentre lasci che il motore faccia il resto.In questo caso, ascolti e gestisci eventi relativi a monete che vengono toccate.Lo script definisce la logica per gestire questo evento nel metodo onCoinTouched(), che esegue quanto Seguendo:
Rileva se la moneta è abilitata - Ogni Instance ha un attributo booleano Enabled che definisce se l'oggetto esista o meno nel Mondo3D.Puoi ottenere gli attributi dell'istanza con il metodo GetAttribute().
Rileva se un giocatore ha toccato la moneta - Se una moneta è abilitata, il metodo utilizza il servizio del giocatore per verificare 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 controlla per vedere se il padre di otherPart appartiene a un Giocatore.
Disabilita la moneta se un giocatore la tocca, e la riabilita dopo 10 secondi - Infine, se un giocatore tocca la moneta, il metodo disabilita la moneta, aspetta 10 secondi, e poi riabilita la moneta per la Collezioni.task.wait() è utilizzato invece di wait() perché fornisce una migliore performance non fermando completamente l'esecuzione del codice, consentendo alle attività in altri thread di essere eseguite contemporaneamente.
Definire il gestore 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("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
Connetti il gestore eventi
Tutti gli oggetti 3D simulati ereditati da BasePart e quindi hanno un evento Touched().Il seguente ciclo connette il onTouchedEvent() handler al evento di tocco di ogni moneta facendo quanto Seguendo:
Loop attraverso tutte le monete - Loop attraverso ciascuna delle monete utilizzando l'iterazione generale.
Connetti il gestore all'evento - In ogni iterazione del ciclo, la moneta è abilitata per impostazione predefinita, quindi è visibile nel mondo 3D durante l'avvio iniziale dell'esperienza.Il metodo handler onCoinTouched() è anche connesso all'evento Touched della moneta in modo che venga eseguito ogni volta che si verifica l'evento.Quando il motore rileva un tocco, passa anche nell'oggetto che ha toccato l'oggetto, otherPart .
Connettere il gestore eventifor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
Prova la meccanica
È tempo di vedere se la meccanica della raccolta delle monete funziona come previsto. Per testare la tua esperienza:
Nella barra degli strumenti, fai clic sul pulsante Gioca . Studio entra in modalità playtest.
Sposta il tuo personaggio per toccare una moneta.Se i tuoi script funzionano correttamente, la finestra Output mostra Player collected coin e la moneta scompare per 10 secondi prima di riapparire.