Während der Grundlegenden Skript-Tutorials hast du individuelle Teile, um spielbare Szenen zu erstellen. Mit der vorherigen Methode, wenn du die Teile duplizierst, würdest du dann auch doppelte Skripte haben. Dies würde das Aktualisieren der Skripte langweilig machen, da die Änderungen manuell durchgeführt werden müssen.
In diesem Tutorial wird ein anderes Muster verwendet, um eine Reihe von Gesundheitspickups zu erstellen, mit nur einer Kopie des Skripts, die das Gesundheitspickup-Verhalten bestimmt. Wenn der Pickup berührt wird, wird die Gesundheit des Spieler:inwiederhergestellt, verblasst leicht und deaktiviert für eine kurze Zeit.
Einstellungen
Zuerst brauchst du ein Teil oder ein Modell, um als Aufhänger zu verwendet werden. Die Showdown Town Beispielwelt enthält viele Gesundheitspickups, die auf der Karte verteilt sind.
Jeder Gesundheitspickup ist eine Union von zwei rechteckigen Teilen mit einem grünen PointLight innen. Sie werden alle in einem Ordner im Workspace namens Gesundheitspickups gespeichert, in dem das Skript sie sucht. Wenn Sie etwas mehr auf die Karte hinzufügen, ist es wesentlich, dass Sie sicherstellen, dass sie auch in diesem Ordner gespeichert sind.
Gesundheit wiederherstellen
Um mit dem Skript zu beginnen, muss die Gesundheit eines Spieler:inwiederhergestellt werden. Dieses Muster sollte Ihnen aus dem Tödlichen Lava-Tutorial bekannt sein.
In ServerScriptService fügen Sie ein Skript hinzu, das PickupManager heißt.
In diesem Skript, das. PL: die Skriptserklären Sie eine Konstante namens MAX_HEALTH mit dem Wert 100 .
Erstellen Sie eine Funktion namens onTouchHealthPickup mit Parametern für den anderen Teil, der das Pickup und das Pickup selbst berührt hat.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endIn der Funktion, erhalten Sie das Charaktermodell von der Eltern von otherPart. Danach überprüfen Sie, ob es ein Humanoid mit FindFirstChildWhichIsA() verwendet.
Wenn es einen Humanoid hat, setzen Sie seine Gesundheitseigenschaft 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 Pickups-Ordner erhalten
Der Ordner, der die Gesundheits-Pickups enthält, kann nicht in das Spiel geladen worden sein, bis die Skript-Ausführung abgeschlossen ist. WaitForChild kann verwendet werden, um das Skript zu pausieren und den Gesundheits-Pickups-Ordner zu erhalten, wenn es geladen wird.
Wenn auf einen Ordner aufgerufen wird, gibt die GetChildren Funktion eine Reihe der Ordnerinhalte zurück.
Unter MAX_HEALTH deklarieren Sie eine Variable namens healthPickupsFolder und verwenden Sie die Funktion WaitForChild, um den HealthPickups -Ordner aus dem Arbeitsbereichzu erhalten.
Erstellen Sie eine Variable namens healthPickups, um das Ergebnis der Aufrufe 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
Looping mit ipairs
onTouchHealthPickup muss für jeden Gesundheitsschub im Array aufgerufen werden. Um dies effizient zu tun, wird eine neue Art von Loop-Syntax verwendet.
ipairs ist eine Funktion, die mit einem for-Loop verwendet werden kann, um jedes Element einer Arraydurchzugehen. Sie müssen nicht angeben, wo der Loop beginnt und endet. Ein for-Loop, der ipairs verwendet, ist wie folgt definiert:
- Index : das entspricht der Kontroll variablen in einem regulären for loop.
- Wert : Dies wird mit jedem Element in der Matrix gefüllt, wenn die Loop- Iterationen. Es ist eine gute Idee, den Wert Variable nach dem, was es tatsächlich enthalten wird, zu benennen.
- Array : das Array, über das Sie wiederholen möchten, wird an die Funktion ipairs übergeben.
Im folgenden Codesmusst du den Index für nichts benötigen, so dass er mit _ leer gelassen werden kann. Erstellen Sie einen für Loop mit der Funktion ipairs, indem Sie 1> healthPickups1> ü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
Eine Wrap-Funktion wird benötigt, um die Gesundheitsabholung an die onTouchHealthPickup Funktion zu übergeben, wenn Sie sich mit dem Ereignis Touched verbinden.
In der for-Schleife verbinden Sie das Touched-Ereignis mit einer anonymen Funktion mit einem Parameter namens otherPart.
Rufen Sie die Funktion onTouchHealthPickups auf, wobei Sie sowohl den otherPart -Parameter als auch den healthPickup -Parameter übergeben.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Testen Sie Ihren Code jetzt und Sie sollten finden, dass die Gesundheitsaufnahme Ihre Gesundheit wiederherstellt. Sie müssen zuerst Ihren Spieler schaden - versuchen Sie, auf dem Lüftungsgitter neben dem Spawn-Punkt zu stehen.
Ein Gesundheits-Bar sollte in der oberen rechten erscheinen, die verschwindet, wenn der Spieler geheilt wird.
Abholungs-Cooldown
Derzeit wird die Aufhebung einer Person dauerhaft jeden Spieler heilen, 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 müssen Sie aufzeichnen, ob oder nicht der Pickup in der Abklingzeit ist. Das Muster unten sollte dem Verblasstrappe -Muster ähnlich sein - diesmal wird der Debounce durch die Festlegung eines Attributs auf der Gesundheits-Pickup erzielt.
In der for-Schleife setzen Sie ein neues Merkmal namens #Enabled" auf true.
Wrap the code inside onTouchHealthPickup in an if statement with the condition 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
Deaktivieren des Pickups
Der Pickup sollte visuelle Feedback liefern, die es deaktiviert - ein häufiger Weg, dies zu tun, ist, es ein wenig durchsichtig zu machen.
Erklären Sie drei Konstanten oben in dem Skript (fühlen Sie sich frei, jeden Wert anzupassen, wie Sie möchten):
- 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 setzen Sie die Transparency des Pickups auf DISABLED_TRANSPARENCY und den Wert des Attributs 1> Enabled1> 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 Funktion Library.task.wait() auf, wobei COOLDOWN als Anzahl zum Warten angeben.
Set Transparency zurück zu ENABLED_TRANSPARENCY und Enabled zurück zu 1> true1> .
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
Testen Sie Ihren Pickup erneut: Sie sollten finden, dass, wenn Sie den Pickup berühren, Ihre Gesundheit wiederhergestellt wird, undurchsichtig wird und dann wieder verwendet werden kann.
Wenn Sie das Feedback für den Spieler nach dem Aufheben von der Ware einsammeln möchten, versuchen Sie, die Helligkeit des PointLight im Aufheber zu reduzieren, wenn Sie die Transparenz ändern.
Versuchen Sie, diese Gesundheitspickups in Ihren eigenen Projekten zu verwenden, oder ändern Sie das Aussehen und den Effekt, um einer anderen Art von Power-up für Ihre Spieler zu geben.
End-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