Während der grundlegenden Skript-Tutorials hast du einzelne Teile skriptiert, um spielbare Szenen zu erstellen.Mit der vorherigen Methode, wenn du die Teile duplizieren würdest, hättest du dann auch doppelte Skripte.Dies würde das Aktualisieren der Skripte mühsam machen, da jede Änderung einzeln durchgeführt werden müsste.
In diesem Tutorial wird ein anderes Muster verwendet, um eine Reihe von Gesundheitspickups zu erstellen, mit nur einer einzigen Kopie des Skripts, das das Gesundheitspickup-Verhalten bestimmt.Wenn die Aufnahme berührt wird, wird die Gesundheit des Spieler:inwiederhergestellt, verbleicht leicht und wird für kurze Zeit deaktiviert.
Einrichten
Zuerst benötigen Sie ein Teil oder ein Modell, das Sie als Abholung verwenden können.Die Showdown-Stadt-Beispielwelt enthält viele Gesundheitspickups, die sich über die Karte verteilt sind.

Jede Gesundheitsaufnahme ist eine Union von zwei rechteckigen Teilen mit einem grünen PointLight im Inneren.Sie werden alle in einem Ordner im Arbeitsbereich namens HealthPickups gespeichert, wo das Skript nach ihnen suchen wird.Wenn du der Karte weitere hinzufügst, ist es wichtig, dass sie auch in diesem Ordner gespeichert werden.


Gesundheit wiederherstellen
Zu Beginn muss das Skript die Gesundheit eines Spieler:inwiederherstellen. Dieses Muster sollte dir aus dem Tödlichen Lava-Tutorial bekannt sein.
In ServerScriptService füge ein Skript namens PickupManager hinzu.
In diesem Skript, das. PL: die Skriptserklären Sie eine Konstante namens MAX_HEALTH mit dem Wert 100 .
Erstelle eine Funktion namens onTouchHealthPickup mit Parametern für den anderen Teil, der die Aufnahme und die Aufnahme selbst berührt hat.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endIn der Funktion, holen Sie das Charaktermodell vom Elternteil von otherPart. Überprüfen Sie als Nächstes, ob es Humanoid mit FindFirstChildWhichIsA() verwendet.
Wenn es einen Humanoiden hat, setze seine Lebensqualität -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
Holen Sie sich den Ordner Abholungen
Der Ordner, der die Gesundheitsabholungen enthält, kann bis zur Laufzeit des Skripts nicht in das Spiel geladen worden sein.WaitForChild kann verwendet werden, um das Skript anzuhalten und den HealthPickups-Ordner zu erhalten, wenn er geladen wird.
Wenn auf einen Ordner zugegriffen wird, gibt die GetChildren-Funktion eine Array der Inhalte des Ordners zurück.
Unter MAX_HEALTH erklären Sie eine Variable namens healthPickupsFolder und verwenden die Funktion WaitForChild, um den Ordner HealthPickups aus dem Arbeitsbereich zu erhalten.
Erstelle eine Variable mit dem Namen healthPickups, um das Ergebnis des Aufrufs der GetChildren-Funktion 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 jede Gesundheitsaufnahme im Array aufgerufen werden. Um dies effizient zu tun, wird eine neue Art von Schleifenschntax verwendet.
ipairs ist eine Funktion, die mit einer for-Schleife verwendet werden kann, um jedes Element eines Arrays durchzugehen.Du musst nicht angeben, wo der Loop beginnt und endet.Eine Schleife mit der Verwendung von ipairs wird wie folgt definiert:
- Index : Dies entspricht der Kontrollvariable in einer regulären for-Schleife.
- Wert : Dies wird mit jedem Element in der Liste gefüllt, während die Schleife durchläuft.Es ist eine gute Idee, die Wertevariable nach dem zu benennen, was sie tatsächlich enthalten wird.
- Array : Das Array, über das Sie iterieren möchten, wird an die Funktion ipairs übergeben.
Im folgenden Codesbrauchst du den Index für nichts, also kann er mit _ leer gelassen werden.Erstellen Sie eine für Schleife mit der ipairs Funktion, indem Sie healthPickups übergeben.
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
EineWrapper-Funktion wird benötigt, um die Gesundheitsaufnahme an die onTouchHealthPickup Funktion zu übergeben, wenn Sie sich mit dem Touched Event verbinden.
Im for-Schleife verbinden Sie das berührte Ereignis mit einer anonymen Funktion mit dem Parameter otherPart.
Rufen Sie die onTouchHealthPickups Funktion auf, indem Sie sowohl den otherPart Parameter als auch die healthPickup übergeben.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Teste deinen Code jetzt und du solltest feststellen, dass die Gesundheitsaufnahme deine Gesundheit wiederherstellt.Du musst zuerst deinen Spieler beschädigen - versuche, auf den Lüftungsschacht neben dem Spawnpunkt zu stehen.
Eine Gesundheitsleiste sollte in der oberen rechten Ecke erscheinen, die verschwindet, wenn der Spieler geheilt ist.
Abholungsabklingzeit
Derzeit heilt die Aufnahme jeden Spieler unbestimmte Zeit, der sie berührt.Es wäre effektiver in einem Spiel, wenn es nur einmal aufgehoben werden könnte, mit einer kurzen Abklingzeit, bevor es wieder verwendet werden kann.
Zuerst musst du aufzeichnen, ob oder nicht die Abholung in der Abklingzeit ist.Das Muster unten sollte von Fade Trap bekannt sein - dieses Mal wird die Debounce durch die Festlegung eines Attributes auf der Gesundheitsaufnahme erreicht.
Im for-Loop wird ein neues Attribut festgelegt , das "Enabled" genannt wird, zu true.
Wrap den Code innerhalb von onTouchHealthPickup in einem if-Statement 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 die Abholung
Die Aufnahme sollte visuelles Feedback liefern, dass sie deaktiviert ist - eine häufige Möglichkeit, dies anzugeben, besteht darin, sie leicht transparent zu machen.
Erkläre drei Konstanten am oberen Rand des Skripts (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")In der if-Anweisung in onTouchHealthPickup setze den Transparency des Aufgreifens auf DISABLED_TRANSPARENCY und den Wert des Attributes 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)endendendRufen Sie die task.wait()-Funktion auf, indem Sie COOLDOWN als Menge zum Warten übergeben.
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 deine Abholung erneut: Du solltest finden, dass, wenn du die Abholung berührst, deine Gesundheit wiederhergestellt wird, transparent wird und dann zurückkehrt, bereit zum erneuten Gebrauch.
Wenn du das Feedback für den Spieler wirkungsvoller machen möchtest, wenn das Aufgreifen gesammelt wird, versuche, die Helligkeit des PointLights im Aufgreifen zu reduzieren, wenn du die Transparenz änderst.
Versuche, diese Gesundheits-Pickups in deinen eigenen Projekten zu verwenden, oder ändere das Aussehen und den Effekt, um deinen Spielern eine andere Art von Power-Up zu geben.
Letzter Codes
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