In tutto il tutorial di script di base, hai scriptato singoli pezzi per creare scene giocabili. Con il metodo precedente, se duplicassi le parti avresti anche gli script duplicati. Ciò renderebbe l'aggiornamento degli script noioso poiché le modifiche dovrebbero essere fatte uno script alla volta.
In questo Tutoriale, un modello di base diverso verrà utilizzato per creare una serie di pickup di salute, con solo una copia dello script che determina il comportamento di pickup della salute. Quando il pickup viene toccato, restituisce la salute del Giocatore, sbiadisce leggermente e viene disabilitato per un breve periodo di tempo.
Configurazione
Per prima cosa, avrai bisogno di una parte o di un modello da utilizzare come punto d'interruzione. Il mondo degli esempi di città ] Showdown include molti punti d'interruzione sulla mappa.
Ogni pickup di salute è una unione di due parti rettangolari con un punto luce verde all'interno. Tutti sono memorizzati in una cartella all'interno del Workspace chiamata HealthPickups , che è dove lo script li cercherà. Se aggiungi qualcosa di più alla mappa, è essenziale che siano anche memorizzati in questa cartella.
Ripristinare la salute
Per iniziare, lo script deve ripristinare la salute di un Giocatore. Questo pattern dovrebbe essere familiare a te dal TutorialeLava mortale.
In ServerScriptService , aggiungi uno script chiamato PickupManager .
In questo script, dichiari 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 carattere dal padre di otherPart . Quindi, controlla se ha un Humanoid utilizzando FindFirstChildWhichIsA() .
Se ha un humanoid, imposta la loro salute proprietà su MAX_HEALTH .
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Ottenere la cartella delle raccolte
La cartella che contiene le raccolte di salute potrebbe non essere stata caricata nel gioco entro il momento in cui viene eseguito lo script. WaitForChild può essere utilizzato per暂停 lo script e ottenere la cartella HealthPickups quando viene caricato.
Quando viene chiamato in 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 Area di lavoro.
Crea una variabile chiamata healthPickups per memorizzare il risultato dell'invocazione 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
Looping con iipairs
onTouchHealthPickup deve essere chiamato per ogni pickup di salute nell' vettore. Per fare questo in modo efficiente, verrà utilizzato un nuovo tipo di sintassi del loop.
ipairs è una funzione che può essere utilizzata con un for loop per passare attraverso ogni elemento di un vettore. Non è necessario specificare dove inizia e finisce il loop. Un for loop che utilizza ipairs è definito come segue:
- Indice : questo è equivalente alla variabile di controllo in un loop regolare.
- Valore : questo verrà popolato con ogni elemento nell' array mentre l'iterazione del ciclo si ripetisce. È una buona idea nomare la variabile di valore dopo ciò che contiene effettivamente.
- Array: : l' array che vuoi itereggare viene passato alla funzione IPairs .
Nel seguente codice, non è necessario l'indice per qualsiasi cosa, so it can be left blank with _ . Create a for loop using the ipairs function, pass 1> healthPickups1> .
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
Una funzione di wrap-up sarà necessaria per passare il pickup della salute alla funzione onTouchHealthPickup quando si connette all'evento Touched .
Nel for loop, connect the Touched event to an anonymous function with a parameter called otherPart .
Chiama la funzione onTouchHealthPickups, passando sia il parametro otherPart che il parametro 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 pickup della salute resta la tua salute. Dovrai prima danneggiare il tuo giocatore - prova a stare in piedi sulla ventilazione accanto al punto di spawn.
Una barra di salute dovrebbe apparire nella parte superiore destra che scomparirà quando il giocatore è stato curato.
Raccolta Cooldown
Attualmente, il pickup indefittivamente guarisce qualsiasi giocatore che lo tocca. Sarebbe più efficace in un gioco se potesse essere scelto una sola volta, con un breve cooldown prima che possa essere utilizzato di nuovo.
Prima, devi registrare se il ritiro è nel periodo di recupero o no. Il modello seguente dovrebbe essere familiare da Fading Trap - questa volta, il debounce sarà ottenuto impostando un attributo sulla raccolta di salute.
Nel for loop, imposta un nuovo attributo chiamato "Enabled" a true .
Wrap the code inside onTouchHealthPickup in an if statement with the condition 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
Disattivare il Pickup
Il pickup dovrebbe fornire feedback visivi che è disabilitato - un modo comune per indicarlo è rendere leggermente trasparente.
Dichiarare tre costanti nella parte superiore dello script (Sentiti libero di regolare ciascun 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 if statement in onTouchHealthPickup , imposta il Transparency della raccolta su DISABLED_TRANSPARENCY , e il valore dell'attributo 1> Enabled1> 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 1> true1> .
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 tuo pickup: dovresti trovare che quando tocchi il pickup resta la tua salute, diventa trasparente e poi torna pronto per essere utilizzato di nuovo.
Se vuoi rendere il feedback più importante per il giocatore quando viene raccolto il pickup, prova a tagliare la luce della PointLight nel pickup quando cambi la trasparenza.
Prova ad usare queste scelte di salute nei tuoi progetti, o cambia l'aspetto e l'effetto per dare un diverso tipo di potenziamento ai tuoi giocatori.
Codice finale
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