Menu
CoddyTech

Dash mit Q

Lektion 6 von 20 im Kurs Roblox-Spiel: Schlachtfelder von Coddy.

Fähigkeiten beginnen auf dem Gerät des Spielers. BattleClient ist ein LocalScript im HUD, und ContextActionService verknüpft eine Aktion mit Tasten und erstellt mit einem dritten Argument von true auch eine Schaltfläche dafür auf einem Handybildschirm:

ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q)

Die Funktion erhält den Namen der Aktion und den Zustand der Eingabe: Begin, wenn die Taste gedrückt wird. Der Server ist für die Spielregeln zuständig, daher führt der Client den Dash nicht selbst aus: Er fragt den Server über das RemoteEvent Remotes.Ability anhand des Namens an. Der Server speichert eine Tabelle mit Fähigkeiten nach Namen, und ein Dash ist ein Stoß: Durch Festlegen der Geschwindigkeit des Root-Parts wird der Charakter nach vorne geschleudert.

function abilities.Dash(player, character, root)
	root.AssemblyLinearVelocity = root.CFrame.LookVector * Settings.DashSpeed + Vector3.new(0, 15, 0)
end
challenge icon

Aufgabe

Mittel

In BattleClient: Rufe ContextActionService und den Remotes-Ordner ab, schreibe use(name, state), das remotes.Ability beim Status Begin mit dem Namen auslöst, und binde "Dash" mit einer Touch-Schaltfläche an Q.

In BattleServer: Füge local remotes = game.ReplicatedStorage.Remotes und eine Tabelle abilities mit Dash hinzu und verbinde remotes.Ability.OnServerEvent(player, name), damit die benannte Fähigkeit mit dem Spieler, dessen Charakter und dessen Root ausgeführt wird.

Drücke Play und dann Q. Anschließend 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 Schwertschlags

-- Roblox’ eigene Schwertanimationen
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

print("Swords deal " .. Settings.SwordDamage .. " damage")

-- Ein Schwertschlag: 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 Schwertschlag
	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 in jedem 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)

-- Die Trainingspuppe: Ihre Lebensanzeige passt sich ihrer Gesundheit an, und eine besiegte
-- Puppe erscheint kurz darauf als neue Kopie an derselben Stelle wieder
local function setupDummy(dummy)
	local humanoid = dummy.Humanoid
	humanoid.HealthChanged:Connect(function(health)
		dummy.HealthBar.Back.Fill.Size = UDim2.fromScale(health / humanoid.MaxHealth, 1)
	end)
	humanoid.Died:Connect(function()
		local spot = dummy:GetPivot()
		task.wait(0.5)
		dummy:Destroy()
		task.wait(Settings.DummyRespawn)
		local fresh = ServerStorage.Dummy:Clone()
		fresh:PivotTo(spot)
		fresh.Parent = workspace
		setupDummy(fresh)
	end)
end
setupDummy(workspace.Dummy)
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