Durante i tutorial di base di scripting, hai scriptato parti individuali per creare scene giocabili.Con il metodo precedente, se duplicassi le parti avresti anche script duplicati.Ciò renderebbe l'aggiornamento degli script noioso poiché le modifiche dovrebbero essere fatte script per script.
In questo Tutoriale, verrà utilizzato un modello diverso per creare una serie di prelievi di salute, con una sola copia dello script che determina il comportamento di prelievo della salute.Quando il pickup viene toccato, ripristinerà la salute del Giocatore, svanirà leggermente e verrà disabilitato per un breve periodo di tempo.
Configurare
Per prima cosa, avrai bisogno di una parte o di un modello da utilizzare come pickup.Il mondo dell'esempio della città dello scontro include molti punti di salute diffusi in tutta la mappa.

Ogni presa della salute è un'Unione di due parti rettangolari con un PointLight verde all'interno.Sono tutti memorizzati in una cartella nell'area di lavoro chiamata HealthPickups , dove lo script li cercherà.Se aggiungi altro alla mappa, è essenziale assicurarsi che vengano anche memorizzati in questo folder.


Ripristina la salute
Per cominciare, lo script deve ripristinare la salute di un Giocatore. Questo modello dovrebbe essere familiare a te dal TutorialeLava Mortale.
In ServerScriptService , aggiungi uno script chiamato PickupManager .
In questo script, dichiara una costante chiamata MAX_HEALTH con il valore 100 .
Crea una funzione chiamata onTouchHealthPickup con parametri per l'altra parte che ha toccato il pickup e il pickup stesso.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endNella funzione, ottieni il modello di personaggio dal padre di otherPart . Successivamente, controlla se ha un Humanoid utilizzando FindFirstChildWhichIsA() .
Se ha un umanoide, imposta la loro proprietà Salute a MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Ottieni la cartella delle raccolte
La cartella che contiene i ritiri della salute potrebbe non essere stata caricata nel gioco al momento in cui viene eseguito lo script.WaitForChild può essere utilizzato per interrompere lo script e ottenere la cartella HealthPickups quando viene caricata.
Quando viene chiamata su una cartella, la funzione GetChildren restituirà un array dei contenuti della cartella.
Sotto MAX_HEALTH, dichiara una variabile chiamata healthPickupsFolder e usa la funzione WaitForChild per ottenere la cartella HealthPickups dallo spazio di lavoro.
Crea una variabile chiamata healthPickups per archiviare il risultato dell'esecuzione della funzione GetChildren su healthPickupsFolder.
local MAX_HEALTH = 100local healthPickupsFolder = workspace:WaitForChild("HealthPickups")local healthPickups = healthPickupsFolder:GetChildren()local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Ciclo con ipairs
onTouchHealthPickup deve essere chiamato per ogni pickup della salute nell'vettore. Per farlo in modo efficiente, verrà utilizzata una nuova sintassi di loop.
ipairs è una funzione che può essere utilizzata con un ciclo while per passare attraverso ogni elemento di un vettore.Non è necessario specificare dove inizia e finisce il ciclo.Un ciclo A utilizzando ipairs è definito come segue:
- Indice : questo è equivalente alla variabile di controllo in un ciclo for regolare.
- Valore : questo verrà popolato con ogni elemento nell'array mentre il ciclo si ripete.È una buona idea nominare la variabile di valore dopo ciò che effettivamente conterrà.
- Array : l'array che vuoi iterare viene passato alla funzione ipairs.
Nel seguente codice, non hai bisogno dell'indice per nulla, quindi può essere lasciato vuoto con _ .Crea un ciclo per utilizzando la funzione ipairs, passando healthPickups.
local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
for _, healthPickup in ipairs(healthPickups) do
end
Sarà necessaria una funzione wrapper per passare il recupero della salute alla funzione onTouchHealthPickup quando si connette all'evento Touched.
Nel ciclo while, connetti l'evento Touched a una funzione anonima con un parametro chiamato otherPart .
Chiama la funzione onTouchHealthPickups , passando entrambi il parametro otherPart e il healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Prova il tuo codice ora e dovresti trovare che il ripristino della salute ripristina la tua salute.Prima dovrai danneggiare il tuo giocatore - prova a stare sulla ventola accanto al punto di spawn.
Una barra della salute dovrebbe apparire in alto a destra che scomparirà quando il giocatore sarà guarito.
Raccogli il tempo di recupero
Attualmente, il ritiro guarirà indefinitamente qualsiasi giocatore che lo tocca.Sarebbe più efficace in una partita se potesse essere raccolto solo una volta, con un breve tempo di recupero prima che possa essere nuovamente utilizzato.
Prima, devi registrare se il ritiro sia o meno nel periodo di recupero.Il modello seguente dovrebbe essere familiare da Fade Trap - questa volta, il debounce sarà ottenuto impostando un attributo sul recupero della salute.
Nel ciclo while, imposta un nuovo attributo **** chiamato "Enabled" a true .
Avvolgi il codice all'interno di onTouchHealthPickup in una dichiarazione if con la condizione healthPickup:GetAttribute("Enabled") .
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendendendfor _, healthPickup in ipairs(healthPickups) dohealthPickup:SetAttribute("Enabled", true)healthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Disabilita il ritiro
Il ritiro dovrebbe fornire un feedback visivo che è disabilitato - un modo comune per indicare questo è renderlo leggermente trasparente.
Dichiara tre costanti in cima allo script (sentiti libero di regolare ogni valore a tuo piacimento):
- ENABLED_TRANSPARENCY = 0.4
- DISABLED_TRANSPARENCY = 0.9
- COOLDOWN = 10
local MAX_HEALTH = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")Nella dichiarazione if in onTouchHealthPickup , imposta il Transparency del ritiro a DISABLED_TRANSPARENCY e il valore dell'attributo Enabled a falso.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendChiama la funzione task.wait() passando COOLDOWN come quantità da attendere.
Imposta Transparency di nuovo su ENABLED_TRANSPARENCY e Enabled di nuovo su true .
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)task.wait(COOLDOWN)healthPickup.Transparency = ENABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", true)endendend
Prova di nuovo il ritiro: dovresti trovare che quando tocchi il ritiro ripristina la tua salute, diventa trasparente, quindi torna indietro pronto per essere nuovamente utilizzato.
Se vuoi rendere il feedback più rilevante per il giocatore quando il ritiro viene raccolto, prova a ridurre la luminosità del PointLight nel ritiro quando cambi la trasparenza.
Prova ad utilizzare questi punti salute nei tuoi progetti, o cambia l'aspetto e l'effetto per dare un diverso tipo di potenziamento ai tuoi giocatori.
Codice codice
local MAX_HEALTH = 100
local ENABLED_TRANSPARENCY = 0.4
local DISABLED_TRANSPARENCY = 0.9
local COOLDOWN = 10
local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
local healthPickups = healthPickupsFolder:GetChildren()
local function onTouchHealthPickup(otherPart, healthPickup)
if healthPickup:GetAttribute("Enabled") then
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
healthPickup.Transparency = DISABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", false)
task.wait(COOLDOWN)
healthPickup.Transparency = ENABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", true)
end
end
end
for _, healthPickup in ipairs(healthPickups) do
healthPickup:SetAttribute("Enabled", true)
healthPickup.Touched:Connect(function(otherPart)
onTouchHealthPickup(otherPart, healthPickup)
end)
end