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.

Durante i tutorial di Base Scripting, hai scriptato singole parti per creare scene giocabili. Con il metodo precedente, se duplicavi le parti, avresti anche duplicato gli script. Questo avrebbe reso l'aggiornamento degli script noioso, poiché le modifiche avrebbero dovuto essere fatte script per script.

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

Imposta

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

Opzione Modifica in Studio dalla pagina principale del gioco

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 aggiungi altri pickup alla mappa, è essenziale assicurarti che siano memorizzati anche in questa cartella.

Ripristina salute

Per iniziare, 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 utilizzando 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 che contiene i pickup di salute potrebbe non essere stata caricata nel gioco al momento dell'esecuzione dello script. 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 dei contenuti della cartella.

  1. Sotto MAX_HEALTH, dichiara una variabile chiamata healthPickupsFolder e utilizza 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 farlo in modo efficiente, verrà 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 dove inizia e finisce il ciclo. Un ciclo for che utilizza 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 ogni elemento dell'array mentre il ciclo itera. È una buona idea nominare la variabile value in base a ciò che conterrà effettivamente.
  • 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 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 sia il parametro otherPart che il healthPickup.

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

Testa il tuo codice ora e dovresti scoprire che il pickup di salute ripristina la tua salute. Dovrai prima danneggiare il tuo giocatore - prova a stare sul ventilatore accanto al punto di spawn.

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

Una barra della salute dovrebbe apparire in alto a destra e scomparire quando il giocatore viene curato.

Tempo di recupero 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 tempo di recupero prima di poter essere utilizzato di nuovo.

Per prima cosa, devi registrare se il pickup è o meno nel periodo di recupero. Il modello qui sotto dovrebbe esserti familiare dal tutorial Fade Trap - questa volta, il debounce sarà ottenuto 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 indicarlo è 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à 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

Testa di nuovo il tuo pickup: dovresti scoprire che quando tocchi il pickup ripristina la tua salute, diventa trasparente, poi torna pronto per essere utilizzato di nuovo.

Se vuoi 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 utilizzare 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.