Trainingsdummy
Lektion 5 von 20 im Kurs Roblox-Spiel: Schlachtfelder von Coddy.
Die Trainingspuppe braucht zwei Dinge, um eine Trainingspuppe zu sein: eine Gesundheitsleiste und die Fähigkeit, nach einer Niederlage zurückzukommen.
Ihre HealthBar ist ein BillboardGui mit einer grünen Fill innerhalb eines dunklen Back. UDim2.fromScale(health / MaxHealth, 1) sorgt dafür, dass die Füllung so breit ist wie die verbleibende Gesundheit.
Wenn ihr Humanoid Died auslöst, merke dir, wo sie stand (GetPivot), entferne sie, warte Settings.DummyRespawn Sekunden und setze eine frische Kopie aus ServerStorage an ihre Stelle. Die neue Kopie braucht dieselbe Einrichtung, also ist die Einrichtung eine Funktion, die sich für die neue Trainingspuppe selbst aufruft:
local function setupDummy(dummy)
-- Lebensanzeige, und bei Died: ... setupDummy(fresh)
end
setupDummy(workspace.Dummy)Aufgabe
EinfachSchreibe am Ende des Skripts setupDummy(dummy):
- Bei
HealthChangeddes Humanoids: Passe die Größe vondummy.HealthBar.Back.Fillan die verbleibende Gesundheit an. - Bei
Died: Speicheredummy:GetPivot(), warte 0.5 Sekunden, zerstöre es, warteSettings.DummyRespawn, kloneServerStorage.Dummy, verschiebe es an diesen Ort, setze dessen Parent auf workspace und richte es ein.
Rufe die Funktion für workspace.Dummy auf. Drücke Play und dann Check.
Probier es selbst
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> Zeitpunkt des letzten Schwertschwungs
-- Roblox’ eigene Schwertanimationen
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Ein Schwertschwung: erst die Animation, dann werden alle im Bereich vor dir getroffen
local function swing(player)
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if not root or character.Humanoid.Health <= 0 then
return
end
local now = time()
if lastSwing[player] and now - lastSwing[player] < Settings.SwingCooldown then
return
end
lastSwing[player] = now
character.Humanoid.Animator:LoadAnimation(slash):Play()
-- der Bereich vor dir, niemals dein eigener Körper
local params = OverlapParams.new()
params.FilterDescendantsInstances = { character }
local box = root.CFrame * CFrame.new(0, 0, -3)
local hit = {} -- jeder humanoid nur einmal pro Schwertschwung
for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
if humanoid and not hit[humanoid] then
hit[humanoid] = true
humanoid:TakeDamage(Settings.SwordDamage)
end
end
end
-- Jeder Spieler erhält Kills auf der Bestenliste und bei jedem neuen Leben ein Schwert
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local kills = Instance.new("IntValue")
kills.Name = "Kills"
kills.Parent = leaderstats
player.CharacterAdded:Connect(function()
local sword = ServerStorage.Sword:Clone()
sword.Parent = player.Backpack
sword.Activated:Connect(function()
swing(player)
end)
end)
end)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.