Inizia
Tutorial intermedi

Crea un pickup di salute

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

Nel tutorial di Scripting di Base, hai programmato singole parti per creare scenari giocabili. Con il metodo precedente, se duplicavi le parti, avevi anche script duplicati. Questo rendeva l'aggiornamento degli script noioso poiché le modifiche dovevano essere effettuate script per script.

In questo tutorial, sarà utilizzato un modello diverso per creare un certo numero di pickup di salute, con solo una copia dello script che determina il comportamento del pickup di salute. Quando il pickup viene toccato, ripristinerà la salute del giocatore, scomparirà leggermente e sarà disabilitato per un breve periodo di tempo.

Configurazione

Per prima cosa, avrai bisogno di una parte o di un modello da utilizzare come pickup. Il mondo esempio Showdown Town include molti pickup di salute sparsi in tutta la mappa.

Opzione Modifica in Studio dalla pagina principale dell'esperienza

Ogni pickup di salute è un'Unione di due parti rettangolari con una PointLight verde all'interno. Sono tutti memorizzati in una cartella nel Workspace chiamata HealthPickups, che è dove lo script li cercherà. Se ne aggiungi altri alla mappa, è essenziale assicurarti che siano anche memorizzati in questa cartella.

Ripristina la salute

Per cominciare, lo script deve ripristinare la salute di un giocatore. Questo modello dovrebbe esserti familiare dal tutorial Deadly Lava.

  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 del personaggio dal genitore di otherPart. Successivamente, controlla se ha un Humanoid usando FindFirstChildWhichIsA().

  5. Se ha un umanoide, imposta la loro proprietà Health su 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 dei pickup

La cartella contenente i pickup di salute potrebbe non essere stata caricata nell'esperienza nel momento in cui lo script viene eseguito. WaitForChild può essere utilizzato per mettere in pausa lo script e ottenere la cartella HealthPickups quando viene caricata.

Quando chiamato su una cartella, la funzione GetChildren restituirà un array del contenuto della cartella.

  1. Sotto MAX_HEALTH, dichiara una variabile chiamata healthPickupsFolder e usa la funzione WaitForChild per ottenere la cartella HealthPickups dal Workspace.

  2. Crea una variabile chiamata healthPickups per memorizzare il risultato della chiamata alla 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 di salute nell'array. Per fare ciò in modo efficiente, sarà utilizzata una nuova sintassi di ciclo.

ipairs è una funzione che può essere utilizzata con un ciclo for per attraversare ogni elemento di un array. Non è necessario specificare da dove inizia e finisce il ciclo. Un ciclo for usando ipairs è definito come segue:

for index, value in ipairs(array) do

  • Index: questo è equivalente alla variabile di controllo in un ciclo for normale.
  • Value: questo sarà popolato con ciascun elemento nell'array mentre il ciclo itera. È una buona idea nominare la variabile value in base a ciò che conterrà realmente.
  • Array: l'array che desideri iterare viene passato alla funzione ipairs.

Nel codice seguente, non hai bisogno dell'indice per nulla, quindi può essere lasciato vuoto con _. Crea un ciclo for 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 pickup di salute alla funzione onTouchHealthPickup quando ci si connette all'evento Touched.

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

  2. Chiama la funzione onTouchHealthPickups, passando entrambi i parametri otherPart e healthPickup.


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

Adesso prova il tuo codice e dovresti scoprire che il pickup di salute ripristina la tua salute. Dovrai prima danneggiare il tuo giocatore - prova a stare sulla ventilazione accanto al punto di spawn.

Ventilazione fumante nel mondo di esempio a destra del punto di spawn

Una barra della salute dovrebbe apparire in alto a destra e scomparirà quando il giocatore sarà guarito.

Cooldown del pickup

Attualmente, il pickup curerà indefinitamente qualsiasi giocatore che lo tocca. Sarebbe più efficace se potesse essere raccolto solo una volta, con un breve cooldown prima di poterlo usare di nuovo.

Per prima cosa, devi registrare se il pickup è o meno nel periodo di cooldown. Il modello qui sotto dovrebbe esserti familiare dal tutorial Fade Trap - questa volta, il debounce sarà raggiunto impostando un attributo sul pickup di salute.

  1. Nel ciclo for, imposta un nuovo attributo chiamato "Enabled" su true.

  2. Avvolgi il codice all'interno di onTouchHealthPickup in un'istruzione 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 pickup

Il pickup 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 ciascun 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. Nell'istruzione if in onTouchHealthPickup, imposta la Transparency del pickup su DISABLED_TRANSPARENCY, e il valore dell'attributo Enabled su false.


    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à di attesa.

  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 tuo pickup: dovresti scoprire che quando tocchi il pickup, ripristina la tua salute, diventa trasparente e poi torna pronto per essere riutilizzato.

Se desideri rendere il feedback più impattante per il giocatore quando il pickup viene raccolto, prova a ridurre la luminosità della PointLight nel pickup quando cambi la trasparenza.

Prova a usare questi pickup 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
© 2026 Roblox Corporation. Roblox, il logo Roblox e Powering Imagination sono tra i nostri marchi registrati e non registrati negli Stati Uniti. e altri paesi.