Crea un ritiro della salute

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

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.

Edit in Studio option from the experience's main page

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.

  1. In ServerScriptService , aggiungi uno script chiamato PickupManager .

  2. In questo script, dichiara una costante chiamata MAX_HEALTH con il valore 100 .

  3. Crea una funzione chiamata onTouchHealthPickup con parametri per l'altra parte che ha toccato il pickup e il pickup stesso.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Nella funzione, ottieni il modello di personaggio dal padre di otherPart . Successivamente, controlla se ha un Humanoid utilizzando FindFirstChildWhichIsA() .

  5. Se ha un umanoide, imposta la loro proprietà Salute a MAX_HEALTH.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

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.

  1. Sotto MAX_HEALTH, dichiara una variabile chiamata healthPickupsFolder e usa la funzione WaitForChild per ottenere la cartella HealthPickups dallo spazio di lavoro.

  2. Crea una variabile chiamata healthPickups per archiviare il risultato dell'esecuzione della funzione GetChildren su healthPickupsFolder.


    local MAX_HEALTH = 100
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
    local healthPickups = healthPickupsFolder:GetChildren()
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

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.

  1. Nel ciclo while, connetti l'evento Touched a una funzione anonima con un parametro chiamato otherPart .

  2. Chiama la funzione onTouchHealthPickups , passando entrambi il parametro otherPart e il healthPickup.


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.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.

  1. Nel ciclo while, imposta un nuovo attributo **** chiamato "Enabled" a true .

  2. 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") then
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end
    end
    for _, healthPickup in ipairs(healthPickups) do
    healthPickup: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.

  1. 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 = 100
    local ENABLED_TRANSPARENCY = 0.4
    local DISABLED_TRANSPARENCY = 0.9
    local COOLDOWN = 10
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
  2. 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") 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)
    end
    end
    end
  3. Chiama la funzione task.wait() passando COOLDOWN come quantità da attendere.

  4. Imposta Transparency di nuovo su ENABLED_TRANSPARENCY e Enabled di nuovo su true .


    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

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