Im Verlauf der Grundlagen-Scripting-Tutorials hast du einzelne Teile programmiert, um spielbare Szenen zu erstellen. Mit der vorherigen Methode, wenn du die Teile duplizierst, hättest du auch duplizierte Skripte. Das würde das Aktualisieren der Skripte mühsam machen, da Änderungen skriptweise vorgenommen werden müssten.
In diesem Tutorial wird ein anderes Muster verwendet, um eine Anzahl von Gesundheitsabholobjekten zu erstellen, mit nur einer einzigen Kopie des Skripts, das das Verhalten des Gesundheitsabholobjekts bestimmt. Wenn das Abholobjekt berührt wird, stellt es die Gesundheit des Spielers wieder her, verblasst leicht und wird für eine kurze Zeit deaktiviert.
Einrichten
Zuerst benötigst du ein Teil oder ein Modell, das als Abholobjekt verwendet werden kann. Die Showdown Town Beispielwelt enthält viele Gesundheitsabholobjekte, die über die Karte verteilt sind.

Jedes Gesundheitsabholobjekt ist eine Union aus zwei rechteckigen Teilen mit einem grünen PointLight in der Mitte. Sie sind alle in einem Ordner im Workspace mit dem Namen HealthPickups gespeichert, in dem das Skript nach ihnen suchen wird. Wenn du weitere zur Karte hinzufügst, ist es unerlässlich, dass du sicherstellst, dass sie auch in diesem Ordner gespeichert sind.


Gesundheit wiederherstellen
Um zu beginnen, muss das Skript die Gesundheit eines Spielers wiederherstellen. Dieses Muster sollte dir aus dem Tutorial Tödliche Lava bekannt sein.
Füge in ServerScriptService ein Skript mit dem Namen PickupManager hinzu.
Deklariere in diesem Skript eine Konstante mit dem Namen MAX_HEALTH und dem Wert 100.
Erstelle eine Funktion mit dem Namen onTouchHealthPickup, die Parameter für das andere Teil, das das Abholobjekt berührt hat, und das Abholobjekt selbst hat.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endIn der Funktion hole das Charaktermodell vom Elternteil von otherPart. Überprüfe dann, ob es ein Humanoid mit FindFirstChildWhichIsA() hat.
Wenn es einen Humanoid gibt, setze dessen Health-Eigenschaft auf MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Den Abholordner abrufen
Der Ordner, der die Gesundheitsabholobjekte enthält, wurde möglicherweise nicht in die Erfahrung geladen, als das Skript ausgeführt wurde. WaitForChild kann verwendet werden, um das Skript anzuhalten und den HealthPickups-Ordner zu erhalten, wenn er geladen wird.
Wenn bei einem Ordner die Funktion GetChildren aufgerufen wird, wird ein Array der Inhalte des Ordners zurückgegeben.
Unter MAX_HEALTH, deklariere eine Variable mit dem Namen healthPickupsFolder und verwende die Funktion WaitForChild, um den HealthPickups-Ordner aus dem Workspace zu erhalten.
Erstelle eine Variable mit dem Namen healthPickups, um das Ergebnis des Aufrufs der Funktion GetChildren auf healthPickupsFolder zu speichern.
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
Schleife mit ipairs
onTouchHealthPickup muss für jedes Gesundheitsabholobjekt im Array aufgerufen werden. Um dies effizient zu tun, wird eine neue Art von Schleifensyntax verwendet.
ipairs ist eine Funktion, die mit einer for-Schleife verwendet werden kann, um jedes Element eines Arrays durchzugehen. Du musst nicht angeben, wo die Schleife beginnt und endet. Eine for-Schleife, die ipairs verwendet, wird wie folgt definiert:

- Index: das entspricht der Steuerungsvariablen in einer regulären for-Schleife.
- Value: dies wird mit jedem Element im Array befüllt, während die Schleife iteriert. Es ist eine gute Idee, die Wertevariable nach dem zu benennen, was sie tatsächlich enthalten wird.
- Array: das Array, über das du iterieren möchtest, wird der ipairs-Funktion übergeben.
Im folgenden Code benötigst du den Index für nichts, also kann er mit _ leer gelassen werden. Erstelle eine for-Schleife, die die ipairs-Funktion verwendet und healthPickups übergibt.
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
Eine Wrapper-Funktion wird benötigt, um das Gesundheitsabholobjekt an die Funktion onTouchHealthPickup zu übergeben, wenn du dich mit dem Touched-Ereignis verbindest.
Verbinde im for-Schleifen die Touched-Event mit einer anonymen Funktion mit einem Parameter namens otherPart.
Rufe die Funktion onTouchHealthPickups auf und übergebe sowohl den Parameter otherPart als auch das healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Testet jetzt deinen Code und du solltest feststellen, dass das Gesundheitsabholobjekt deine Gesundheit wiederherstellt. Du musst deinen Spieler zuerst schädigen - versuche, auf das Dampfrohr neben dem Spawnpunkt zu stehen.

Eine Gesundheitsleiste sollte oben rechts erscheinen, die verschwindet, wenn der Spieler geheilt wird.
Abholobjekt Abklingzeit
Derzeit wird das Abholobjekt unendlich vielen Spielern, die es berühren, Gesundheit wiederherstellen. Es wäre effektiver, wenn es nur einmal abholbar wäre, mit einer kurzen Abklingzeit, bevor es erneut verwendet werden kann.
Zuerst musst du festhalten, ob sich das Abholobjekt im Abklingzeitraum befindet oder nicht. Das Muster unten sollte dir aus dem Tutorial Fade Trap bekannt sein – diesmal wird die Entprellung durch Setzen eines Attributs am Gesundheitsabholobjekt erreicht.
Setze im for-Schleifen ein neues Attribut mit dem Namen "Enabled" auf true.
Wickle den Code innerhalb von onTouchHealthPickup in eine If-Anweisung mit der Bedingung 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
Deaktiviere das Abholobjekt
Das Abholobjekt sollte visuelles Feedback geben, dass es deaktiviert ist – eine gängige Methode, dies anzuzeigen, besteht darin, es leicht transparent zu machen.
Deklariere drei Konstanten oben im Skript (fühle dich frei, jeden Wert nach Belieben anzupassen):
- 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")Setze in der If-Anweisung in onTouchHealthPickup die Transparency des Abholobjekts auf DISABLED_TRANSPARENCY und den Wert des Attributs Enabled auf 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)endendendRufe die Funktion task.wait() auf und übergebe COOLDOWN als Wartezeit.
Setze Transparency zurück auf ENABLED_TRANSPARENCY und Enabled wieder auf 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
Teste dein Abholobjekt erneut: Du solltest feststellen, dass beim Berühren des Abholobjekts deine Gesundheit wiederhergestellt wird, es transparent wird und dann bereit ist, erneut verwendet zu werden.
Wenn du das Feedback für den Spieler beim Einsammeln des Abholobjekts beeindruckender gestalten möchtest, versuche die Helligkeit des PointLight im Abholobjekt zu verringern, wenn du die Transparenz änderst.
Versuche, diese Gesundheitsabholobjekte in deinen eigenen Projekten zu verwenden oder das Aussehen und die Wirkung zu ändern, um den Spielern eine andere Art von Power-up zu geben.
Endgültiger 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