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)
endAufgabe
MittelIn 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)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.