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.

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.
Dans ServerScriptService, ajoutez un script appelé PickupManager.
Dans ce script, déclarez une constante appelée MAX_HEALTH avec la valeur 100.
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 = 100local function onTouchHealthPickup(otherPart, healthPickup)endDans la fonction, obtenez le modèle du personnage à partir du parent de otherPart. Ensuite, vérifiez s'il a un Humanoid en utilisant FindFirstChildWhichIsA().
S'il a un humanoïde, définissez sa propriété Health sur MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
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.
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.
Créez une variable nommée healthPickups pour stocker le résultat de l'appel à la fonction GetChildren sur 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
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 :

- 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.
Dans la boucle for, connectez l'événement Touched à une fonction anonyme avec un paramètre appelé otherPart.
Appelez la fonction onTouchHealthPickups, en passant à la fois le paramètre otherPart et le healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.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.

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é.
Dans la boucle for, définissez un nouvel attribut appelé "Enabled" sur true.
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") 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
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.
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 = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")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") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendAppelez la fonction task.wait(), en passant COOLDOWN comme montant à attendre.
Réinitialisez Transparency à ENABLED_TRANSPARENCY et Enabled à true.
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
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