Menu
CoddyTech

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)
challenge icon

Aufgabe

Einfach

Schreibe am Ende des Skripts setupDummy(dummy):

  1. Bei HealthChanged des Humanoids: Passe die Größe von dummy.HealthBar.Back.Fill an die verbleibende Gesundheit an.
  2. Bei Died: Speichere dummy:GetPivot(), warte 0.5 Sekunden, zerstöre es, warte Settings.DummyRespawn, klone ServerStorage.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)
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Roblox-Spiel: Schlachtfelder