Dans les tutoriels de script de base, vous avez des parties individuelles scriptées pour créer des scènes jouables. Avec la méthode précédente, si vous dupliquiez les parties, vous aurez alors également des scripts dupliqués. Cela rendrait l'更新 des scripts tedieux car les changements devraient être effectués script par script.
Dans ce tutoriel, un modèle différent sera utilisé pour créer un certain nombre de pickups de santé, avec une seule copie du script qui détermine le comportement de pickup de santé. Lorsque le pickup est touché, il restaure la santé du joueur, puis s'éteint légèrement et est désactivé pour une courte période de temps.
Mise en place
Tout d'abord, vous aurez besoin d'une partie ou d'un modèle à utiliser comme point d'atterrissage. Le monde d'exemple de la ville de Showdown inclut de nombreux points d'atterrissage de santé répartis sur la carte.
Chaque prise de santé est une union de deux parties rectangulaires avec un point lumineux vert à l'intérieur. Ils sont tous stockés dans un dossier dans l'espace de travail nommé prises de santé , qui est l'endroit où le script les cherchera. Si vous ajoutez plus de choses à la carte, il est essentiel que vous gariez que elles sont également stockées dans ce dossier.
Restauration de la santé
Pour commencer, le script doit restaurer la santé d'un joueur. Ce modèle devrait être familier pour vous à partir du Deadly Lava tutoriel.
Dans ServerScriptService , ajoutez un script appelé PickupManager .
Dans ce script, déclarez une constant nommée MAX_HEALTH avec la valeur 100 .
Créez une fonction appelée onTouchHealthPickup avec des paramètres pour la partie qui a touché le pickup et le pickup lui-même.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endDans la fonction, obtenez le modèle de caractère du parent de otherPart . Ensuite, vérifiez si il a un Humanoid à l'aide de FindFirstChildWhichIsA() .
Si elle a un humanoid, définissez leur propriété Santé 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
Obtention du dossier de ramassage
Le dossier contenant les pickups de santé peut ne pas avoir été chargé dans le jeu au moment de l'exécution du script. WaitForChild peut être utilisé pour暂停 le script et obtenir le dossier HealthPickups lorsqu'il se charge.
Lorsqu'il est appelé sur un dossier, la fonction GetChildren renverra un tableau des contenus du dossier.
Sous MAX_HEALTH, déclarez une variable appelée healthPickupsFolder et utilisez la fonction WaitForChild pour obtenir le dossier HealthPickups du Workspace.
Créez une variable nommée healthPickups pour stocker le résultat de l'appel de 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
Looping avec ipairs
onTouchHealthPickup doit être appelé pour chaque prise de santé dans l'matrice. Pour ce faire efficacement, un nouveau type de syntaxe de boucle sera utilisé.
ipairs est une fonction qui peut être utilisée avec un for loop pour passer à travers chaque élément d'un matrice. Vous n'avez pas besoin de spécifier où le for loop commence et se termine. Un for loop utilisant ipairs est défini comme suivant :
- Index : ceci est équivalent à la variable de contrôle dans un régulier pour boucle.
- Valeur : ceci sera rempli avec chaque élément dans l'arrêt à mesure que l'itération se répète. 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 souhaitez itérer est passé à la fonction IPairs.
Dans le code suivant, vous n'avez pas besoin de l'index pour quoi que ce soit, so it can be left blank with _ . Créer un pour boucle en utilisant la fonction ipairs, en passant 1> healthPickups1> .
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 deWrapup sera nécessaire pour passer la récupération de la 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 nommé otherPart .
Appuyez sur la fonction onTouchHealthPickups, en passant à la fois le paramètre otherPart et le paramètre healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Testez votre code maintenant et vous devriez trouver que la récupération de santé restaure votre santé. Vous devrez d'abord endommager votre joueur - essayez de vous tenir debout sur le conduit près du point d'apparition.
Une barre de santé apparaît dans le coin supérieur droit qui disparaît lorsque le joueur est soigné.
Temps de recharge de la récupération
Actuellement, le pickup soignera infiniment n'importe quel joueur qui le touchera. Il serait plus efficace dans un jeu si il ne pouvait être touché qu'une fois, avec un court temps de recharge avant qu'il puisse être utilisé à nouveau.
Tout d'abord, vous devez enregistrer si oui ou non la récupération est dans la période de récupération. Le motif ci-dessous devrait être familier à partir de Fading Trap - cette fois, le débounce sera atteint en configurant une attribut sur la récupération de santé.
Dans la boucle for, définissez un nouveau 属性 nommé "Enabled" à true .
Wrap le code dans onTouchHealthPickup 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ésactivé de la ramassage
La prise en charge doit fournir des commentaires visuels qu'il est désactivé - une façon commune d'indiquer ceci est de le rendre légèrement transparent.
Déclarez trois constantes en haut du script (n'hésitez pas à ajuster chacune des valeurs à 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 la déclaration if dans onTouchHealthPickup, définissez la Transparency de la capture de données à DISABLED_TRANSPARENCY, et la valeur de l'attribut 1> Enabled1> à 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)endendendAppeler la fonction task.wait(), en passant COOLDOWN comme quantité à attendre.
Définir Transparency de retour à ENABLED_TRANSPARENCY et Enabled de retour à 1> true1> .
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 votre récupération de nouveau : vous devriez trouver que lorsque vous touchez le récupérateur, il restaure votre santé, devient transparent, puis revient prêt à être utilisé à nouveau.
Si vous voulez rendre le retour d'information plus impactant pour le joueur lorsque le pickup est collecté, essayez de couper la luminosité de la PointLight dans le pickup lorsque vous changez la transparence.
Essayez d'utiliser ces points de vie dans vos propres projets, ou changez l'apparence et l'effet pour donner un autre type 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