Tutorials für Fortgeschrittene

Erstelle ein Gesundheitsabholobjekt

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

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.

Bearbeitungsoption im Studio von der Hauptseite der Erfahrung

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.

  1. Füge in ServerScriptService ein Skript mit dem Namen PickupManager hinzu.

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

  3. 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 = 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 mit FindFirstChildWhichIsA() hat.

  5. Wenn es einen Humanoid gibt, 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

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.

  1. Unter MAX_HEALTH, deklariere eine Variable mit dem Namen healthPickupsFolder und verwende die Funktion WaitForChild, um den HealthPickups-Ordner aus dem Workspace zu erhalten.

  2. Erstelle eine Variable mit dem Namen 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 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:

for index, value in ipairs(array) do

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

  1. Verbinde im for-Schleifen die Touched-Event 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

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.

Dampfrohr in der Beispielwelt rechts vom Spawnpunkt

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.

  1. Setze im for-Schleifen ein neues Attribut mit dem Namen "Enabled" auf true.

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

Das Abholobjekt sollte visuelles Feedback geben, dass es deaktiviert ist – eine gängige Methode, dies anzuzeigen, besteht darin, es leicht transparent zu machen.

  1. 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 = 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 Abholobjekts auf DISABLED_TRANSPARENCY und den Wert des Attributs Enabled 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 wieder 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 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
©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.