Commencer
Tutoriels intermédiaires

Créer un ramassage de santé

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Tout au long des tutoriels de base sur le scripting, vous avez scripté des parties individuelles pour créer des scènes jouables. Avec la méthode précédente, si vous dupliquiez les parties, vous auriez également des scripts en double. Cela rendrait la mise à jour des scripts fastidieuse, car des modifications devraient être apportées script par script.

Dans ce tutoriel, un modèle différent sera utilisé pour créer plusieurs ramassages de santé, avec une seule copie du script qui détermine le comportement du ramassage de santé. Lorsque le ramassage est touché, il restaurera la santé du joueur, s'estompera légèrement et sera désactivé pendant une courte période.

Configuration

Tout d'abord, vous aurez besoin d'une partie ou d'un modèle à utiliser comme ramassage. Le monde exemple Showdown Town comprend de nombreux ramassages de santé répandus sur toute la carte.

Option Éditer dans Studio à partir de la page principale de l'expérience

Chaque ramassage de santé est une union de deux parties rectangulaires avec une PointLight verte à l'intérieur. Ils sont tous stockés dans un dossier dans le Workspace appelé HealthPickups, que le script recherchera. Si vous ajoutez d'autres ressources à la carte, il est essentiel de vous assurer qu'elles sont également stockées dans ce dossier.

Restaurer la santé

Pour commencer, le script doit restaurer la santé d'un joueur. Ce modèle devrait vous être familier à partir du tutoriel Lave Mortelle.

  1. Dans ServerScriptService, ajoutez un script appelé PickupManager.

  2. Dans ce script, déclarez une constante appelée MAX_HEALTH avec la valeur 100.

  3. Créez une fonction appelée onTouchHealthPickup avec des paramètres pour l'autre partie qui a touché le ramassage et le ramassage lui-même.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Dans la fonction, obtenez le modèle du personnage à partir du parent de otherPart. Ensuite, vérifiez s'il a un Humanoid en utilisant FindFirstChildWhichIsA().

  5. S'il a un humanoïde, définissez sa propriété Health sur 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

Obtenir le dossier des ramassages

Le dossier contenant les ramassages de santé peut ne pas avoir été chargé dans l'expérience au moment où le script s'exécute. WaitForChild peut être utilisé pour mettre en pause le script et obtenir le dossier HealthPickups lorsqu'il se charge.

Lorsqu'elle est appelée sur un dossier, la fonction GetChildren renverra un tableau des contenus du dossier.

  1. En dessous de MAX_HEALTH, déclarez une variable appelée healthPickupsFolder et utilisez la fonction WaitForChild pour obtenir le dossier HealthPickups à partir du Workspace.

  2. Créez une variable nommée healthPickups pour stocker le résultat de l'appel à la fonction GetChildren sur 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

Boucle avec ipairs

onTouchHealthPickup doit être appelé pour chaque ramassage de santé dans le tableau. Pour ce faire efficacement, un nouveau type de syntaxe de boucle sera utilisé.

ipairs est une fonction qui peut être utilisée avec une boucle for pour parcourir chaque élément d'un tableau. Vous n'avez pas besoin de spécifier où commence et se termine la boucle. Une boucle for utilisant ipairs est définie comme suit :

for index, value in ipairs(array) do

  • Index : cela équivaut à la variable de contrôle dans une boucle for régulière.
  • Value : cela sera peuplé avec chaque élément du tableau à mesure que la boucle itère. C'est une bonne idée de nommer la variable de valeur d'après ce qu'elle contiendra réellement.
  • Array : le tableau que vous souhaitez parcourir est passé à la fonction ipairs.

Dans le code suivant, vous n'avez pas besoin de l'index pour quoi que ce soit, vous pouvez donc le laisser vide avec _. Créez une boucle for utilisant la fonction ipairs, en passant 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

Une fonction d'enveloppe sera nécessaire pour passer le ramassage de santé à la fonction onTouchHealthPickup lors de la connexion à l'événement Touched.

  1. Dans la boucle for, connectez l'événement Touched à une fonction anonyme avec un paramètre appelé otherPart.

  2. Appelez la fonction onTouchHealthPickups, en passant à la fois le paramètre otherPart et le healthPickup.


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

Testez votre code maintenant et vous devriez constater que le ramassage de santé restaure votre santé. Vous devrez d'abord endommager votre joueur - essayez de vous tenir sur le ventilateur à côté du point de spawn.

Vent qui fume dans le monde exemple à droite du point de spawn

Une barre de santé devrait apparaître en haut à droite et disparaître lorsque le joueur est guéri.

Temps de recharge du ramassage

Actuellement, le ramassage guérira indéfiniment tout joueur qui le touche. Il serait plus efficace qu'il ne puisse être ramassé qu'une seule fois, avec un court temps de recharge avant qu'il ne puisse être utilisé à nouveau.

Tout d'abord, vous devez enregistrer si le ramassage est ou non dans la période de recharge. Le modèle ci-dessous devrait vous être familier à partir du tutoriel Piège de fondu - cette fois, le debounce sera réalisé en définissant un attribut sur le ramassage de santé.

  1. Dans la boucle for, définissez un nouvel attribut appelé "Enabled" sur true.

  2. Enveloppez le code à l'intérieur de onTouchHealthPickup dans une instruction if avec la condition 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

Désactiver le ramassage

Le ramassage devrait fournir un retour visuel qu'il est désactivé - une manière courante d'indiquer cela est de le rendre légèrement transparent.

  1. Déclarez trois constantes en haut du script (n'hésitez pas à ajuster chaque valeur à votre goût) :

    • 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. Dans l'instruction if dans onTouchHealthPickup, définissez la Transparency du ramassage sur DISABLED_TRANSPARENCY, et la valeur de l'attribut Enabled sur 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. Appelez la fonction task.wait(), en passant COOLDOWN comme montant à attendre.

  4. Réinitialisez Transparency à ENABLED_TRANSPARENCY et Enabled à 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

Testez à nouveau votre ramassage : vous devriez trouver qu'en touchant le ramassage, il restaure votre santé, devient transparent, puis revient prêt à être utilisé à nouveau.

Si vous souhaitez rendre le retour plus marquant pour le joueur lorsque le ramassage est collecté, essayez de réduire la luminosité de la PointLight dans le ramassage lorsque vous changez la transparence.

Essayez d'utiliser ces ramassages de santé dans vos propres projets, ou changez l'apparence et l'effet pour donner un type différent de power-up à vos joueurs.

Code final


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 Société Roblox. Roblox, le logo Roblox et Powering Imagination font partie de nos marques déposées aux États-Unis et dans d'autres pays.