Créer une récupération de santé

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

Pendant les tutoriels de scriptage de base, vous avez scripté des parties individuelles pour créer des scènes jouables.Avec la méthode précédente, si vous deviez dupliquer les parties, vous auriez également des scripts en double.Cela rendrait la mise à jour des scripts fastidieuse car les modifications devraient être faites script par script.

Dans ce tutoriel, un modèle différent sera utilisé pour créer un certain nombre de prises de santé, avec une seule copie du script qui détermine le comportement de la prise de santé.Lorsque la récupération est touchée, elle restaurera la santé du joueur, disparaîtra légèrement et sera désactivée pendant une courte période de temps.

Mettre en place

Tout d'abord, vous aurez besoin d'une partie ou d'un modèle à utiliser comme récupération.Le monde d'exemple de la ville du combat inclut beaucoup de récupérations de santé réparties sur la carte.

Edit in Studio option from the experience's main page

Chaque récupération de santé est une union de deux parties rectangulaires avec un point de lumière vert à l'intérieur.Ils sont tous stockés dans un dossier dans l'espace de travail appelé HealthPickups , où le script les recherchera.Si vous ajoutez plus à la carte, il est essentiel que vous vous assuriez 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 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é la récupération et la récupération elle-même.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Dans la fonction, obtenez le modèle de caractère du parent de otherPart . Ensuite, vérifiez si elle a un Humanoid utilisant FindFirstChildWhichIsA() .

  5. Si elle a un humanoïde, définissez leur propriété santé à .


    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

Obtenez le dossier des prises

Le dossier contenant les prises de santé n'a peut-être pas été chargé dans le jeu 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'on appelle un dossier, la fonction GetChildren retournera 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 du Workspace.

  2. Créer une variable nommée pour stocker le résultat de l'appel de la fonction sur >.


    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 récupération de santé dans l'matrice. Pour le 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 matrice.Vous n'avez pas besoin de spécifier où la boucle commence et se termine.Un cycle A en utilisant ipairs est défini comme suit :

  • Index : c'est équivalent à la variable de contrôle dans une boucle for ordinaire.
  • Valeur : cela sera rempli avec chaque élément de l'array au fur et à mesure que la boucle itère.Il est une bonne idée de nommer la variable de valeur après ce qu'elle contiendra réellement.
  • Array : l'array que vous voulez itérer est passé à la fonction ipairs.

Dans le code suivant, vous n'avez pas besoin de l'index pour quoi que ce soit, donc il peut être laissé vide avec _ .Créez une boucle pour en 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 transmettre la récupération de la 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. Appellez 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 trouver que la récupération de la santé restaure votre santé.Vous devrez d'abord endommager votre joueur - essayez de vous tenir sur la ventilation à côté du point d'apparition.

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

Temps de recharge de récupération

Actuellement, la récupération guérira indéfiniment tout joueur qui la touche.Ce serait plus efficace dans un jeu s'il pouvait seulement être récupéré une fois, avec un court temps de recharge avant qu'il puisse être réutilisé.

Tout d'abord, vous devez enregistrer si le ramassage est ou non dans la période de récupération.Le modèle ci-dessous devrait être familier de Fade Trap - cette fois, le débounce sera atteint en définissant un attribut sur la récupération de la santé.

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

  2. Enveloppez le code dans onTouchHealthPickup à l'intérieur d'une déclaration 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 la récupération

La récupération devrait fournir un retour visuel indiquant qu'elle est désactivée - une façon commune d'indiquer cela est de la rendre légèrement transparente.

  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 la déclaration if dans onTouchHealthPickup, définissez le Transparency de la récupération à DISABLED_TRANSPARENCY et la valeur de l'attribut Enabled à 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. Appellez la fonction task.wait() en passant COOLDOWN comme quantité à attendre.

  4. Définir Transparency de nouveau à ENABLED_TRANSPARENCY et Enabled de nouveau à 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 récupération : vous devriez trouver que lorsque vous touchez la récupération, elle restaure votre santé, devient transparente, puis revient prête à être utilisée à nouveau.

Si vous voulez rendre les commentaires plus impactants pour le joueur lorsque la récupération est collectée, essayez de couper la luminosité de la PointLight dans la récupération lorsque vous changez la transparence.

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

Codes code


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