Im Rahmen der grundlegenden Skripting-Tutorials hast du einzelne Teile programmiert, um spielbare Szenen zu erstellen. Mit der vorherigen Methode hättest du beim Duplizieren der Teile auch duplizierte Skripte erhalten. Dies 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 Gesundheits-Pickups zu erstellen, mit nur einer einzigen Kopie des Skripts, das das Verhalten des Gesundheits-Pickups bestimmt. Wenn das Pickup berührt wird, stellt es die Gesundheit des Spielers wieder her, verblasst leicht und wird für einen kurzen Zeitraum deaktiviert.
Einrichtung
Zuerst benötigst du ein Teil oder ein Modell, das als Pickup verwendet werden kann. Die Showdown Town Beispielwelt enthält viele Gesundheits-Pickups, die über die Karte verteilt sind.

Jeder Gesundheits-Pickup ist eine Union aus zwei rechteckigen Teilen mit einem grünen PointLight darin. Sie sind alle in einem Ordner im Workspace namens HealthPickups gespeichert, in dem das Skript nach ihnen suchen wird. Wenn du weitere auf die Karte hinzufügst, ist es wichtig, dass sie ebenfalls in diesem Ordner gespeichert sind.


Gesundheit wiederherstellen
Zunächst muss das Skript die Gesundheit eines Spielers wiederherstellen. Dieses Muster sollte dir aus dem Deadly Lava Tutorial bekannt sein.
Füge in ServerScriptService ein Skript namens PickupManager hinzu.
Deklariere in diesem Skript eine Konstante namens MAX_HEALTH mit dem Wert 100.
Erstelle eine Funktion namens onTouchHealthPickup mit Parametern für das andere Teil, das das Pickup berührt hat, und das Pickup selbst.
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 hat, indem du FindFirstChildWhichIsA() verwendest.
Wenn es ein Humanoid hat, 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
Hole den Pickup-Ordner
Der Ordner, der die Gesundheits-Pickups enthält, ist möglicherweise noch nicht in das Spiel geladen, wenn das Skript ausgeführt wird. WaitForChild kann verwendet werden, um das Skript anzuhalten und den HealthPickups-Ordner zu erhalten, wenn er geladen wird.
Wenn auf einen Ordner aufgerufen wird, gibt die Funktion GetChildren ein Array des Inhalts des Ordners zurück.
Deklariere unter MAX_HEALTH eine Variable namens healthPickupsFolder und verwende die Funktion WaitForChild, um den HealthPickups-Ordner aus dem Workspace zu erhalten.
Erstelle eine Variable namens 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 Gesundheits-Pickup 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 zu durchlaufen. Du musst nicht angeben, wo die Schleife beginnt und endet. Eine for-Schleife, die ipairs verwendet, wird wie folgt definiert:

- Index: dies entspricht der Steuerungsvariablen in einer regulären for-Schleife.
- Value: dies wird mit jedem Element im Array gefüllt, während die Schleife iteriert. Es ist eine gute Idee, die Wertvariable nach dem zu benennen, was sie tatsächlich enthalten wird.
- Array: das Array, über das du iterieren möchtest, wird an die Funktion ipairs übergeben.
Im folgenden Code benötigst du den Index für nichts, daher kann er mit _ leer gelassen werden. Erstelle eine for-Schleife mit der Funktion ipairs, die 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
endEine Wrapper-Funktion wird benötigt, um das Gesundheits-Pickup an die Funktion onTouchHealthPickup zu übergeben, wenn du dich mit dem Touched-Ereignis verbindest.
Verbinde in der for-Schleife das Touched-Ereignis 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
Teste jetzt deinen Code und du solltest feststellen, dass das Gesundheits-Pickup deine Gesundheit wiederherstellt. Du musst deinen Spieler zuerst beschädigen - versuche, auf das Ventil neben dem Spawnpunkt zu stehen.

Eine Gesundheitsanzeige sollte oben rechts erscheinen, die verschwindet, wenn der Spieler geheilt wird.
Pickup-Abklingzeit
Derzeit wird das Pickup jedem Spieler, der es berührt, unbegrenzt Gesundheit wiederherstellen. Es wäre effektiver, wenn es nur einmal aufgenommen werden könnte, mit einer kurzen Abklingzeit, bevor es erneut verwendet werden kann.
Zuerst musst du aufzeichnen, ob das Pickup sich in der Abklingzeit befindet oder nicht. Das folgende Muster sollte dir aus dem Fade Trap bekannt sein - diesmal wird die Entprellung erreicht, indem ein Attribut am Gesundheits-Pickup gesetzt wird.
Setze in der for-Schleife ein neues Attribut namens "Enabled" auf true.
Umhülle den Code innerhalb von onTouchHealthPickup in einer 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 Pickup
Das Pickup sollte visuelles Feedback geben, dass es deaktiviert ist - eine gängige Möglichkeit, dies anzuzeigen, besteht darin, es leicht transparent zu machen.
Deklariere drei Konstanten oben im Skript (fühle dich frei, jeden Wert nach deinem Geschmack 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 Pickups auf DISABLED_TRANSPARENCY und den Wert des Enabled-Attributs 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 zurück 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 Pickup erneut: Du solltest feststellen, dass es, wenn du das Pickup berührst, deine Gesundheit wiederherstellt, transparent wird und dann wieder bereit ist, verwendet zu werden.
Wenn du das Feedback für den Spieler beim Einsammeln des Pickups wirkungsvoller gestalten möchtest, versuche, die Helligkeit des PointLights im Pickup zu reduzieren, wenn du die Transparenz änderst.
Versuche, diese Gesundheits-Pickups in deinen eigenen Projekten zu verwenden oder das Aussehen und die Wirkung zu ändern, um deinen 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