Erstelle ein Gesundheits-Pickup

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

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.

Bearbeiten in Studio-Option von der Hauptseite des Spiels

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.

  1. Füge in ServerScriptService ein Skript namens PickupManager hinzu.

  2. Deklariere in diesem Skript eine Konstante namens MAX_HEALTH mit dem Wert 100.

  3. 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 = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. In der Funktion hole das Charaktermodell vom Elternteil von otherPart. Überprüfe dann, ob es ein Humanoid hat, indem du FindFirstChildWhichIsA() verwendest.

  5. Wenn es ein Humanoid hat, setze dessen Health-Eigenschaft auf MAX_HEALTH.

    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

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.

  1. Deklariere unter MAX_HEALTH eine Variable namens healthPickupsFolder und verwende die Funktion WaitForChild, um den HealthPickups-Ordner aus dem Workspace zu erhalten.

  2. Erstelle eine Variable namens healthPickups, um das Ergebnis des Aufrufs der Funktion GetChildren auf healthPickupsFolder zu speichern.

    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

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:

for index, value in ipairs(array) do

  • 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
end

Eine Wrapper-Funktion wird benötigt, um das Gesundheits-Pickup an die Funktion onTouchHealthPickup zu übergeben, wenn du dich mit dem Touched-Ereignis verbindest.

  1. Verbinde in der for-Schleife das Touched-Ereignis mit einer anonymen Funktion mit einem Parameter namens otherPart.

  2. Rufe die Funktion onTouchHealthPickups auf und übergebe sowohl den Parameter otherPart als auch das healthPickup.

    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.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.

Dampfendes Ventil in der Beispielwelt rechts vom Spawnpunkt

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.

  1. Setze in der for-Schleife ein neues Attribut namens "Enabled" auf true.

  2. 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") 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

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.

  1. 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 = 100
    local ENABLED_TRANSPARENCY = 0.4
    local DISABLED_TRANSPARENCY = 0.9
    local COOLDOWN = 10
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
  2. 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") 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. Rufe die Funktion task.wait() auf und übergebe COOLDOWN als Wartezeit.

  4. Setze Transparency zurück auf ENABLED_TRANSPARENCY und Enabled zurück auf 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

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
©2026 Roblox Corporation. Roblox, das Roblox-Logo und "Powering Imagination" gehören zu unseren eingetragenen und nicht eingetragenen Markenzeichen in den USA und anderen Ländern.