Q ile Atıl
Coddy'nin Roblox Oyunu: Savaş Arenası kursunda ders 7 / 25.
Bir atılma bir itiştir: bir kökün AssemblyLinearVelocity değerini ayarlamak karakteri fırlatır. Ancak Roblox, her oyuncunun cihazının kendi karakterinin fiziğini çalıştırmasına izin verir; bu nedenle sunucunun ayarladığı bir itiş onları neredeyse hiç hareket ettirmez. Kararı sunucu verir, itişi ise oyuncunun kendi LocalScript'i uygular.
Sunucu, yeteneklerini ada göre bir tabloda tutar ve atılma izni, FireClient ile o oyuncunun istemcisine gönderilir; orada OnClientEvent tarafından alınır:
remotes.Ability.OnClientEvent:Connect(function(name)
if name == "Hop" then
root.AssemblyLinearVelocity = Vector3.new(0, 50, 0)
end
end)Görev
OrtaQ ile atılma yap: sunucu onay verir, cihazın seni ileri iter.
BattleServeriçinde print ifadesini birabilitiestablosuyla değiştir:abilities.Dash(player),remotes.Ability:FireClient(player, "Dash")çağırır.- İşleyici, varsa
abilities[name](player, character, root)çalıştırır. BattleClientiçinde,remotes.Ability.OnClientEventüzerinde"Dash"geldiğinde, kök parçanın hızınıroot.CFrame.LookVector * Settings.DashSpeed + Vector3.new(0, 15, 0)olarak ayarla.
“Oyna” düğmesine bas ve Q'ya bas: ileri doğru atılırsın. Ardından “Kontrol et”.
Kendin dene
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local remotes = game.ReplicatedStorage.Remotes
local lastSwing = {} -- player -> en son ne zaman kılıç savurduğu
-- Roblox'un kendi kılıç animasyonları
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Bir kılıç savurma: animasyon oynar, ardından önündeki kutunun içindeki herkes darbe alır
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()
-- önündeki kutu, kendi vücudun asla dahil değil
local params = OverlapParams.new()
params.FilterDescendantsInstances = { character }
local box = root.CFrame * CFrame.new(0, 0, -3)
local hit = {} -- her humanoid, her kılıç savurmada bir kez
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)
print(humanoid.Parent.Name .. " is at " .. humanoid.Health)
end
end
end
-- İstemci, bir yeteneği adıyla ister
remotes.Ability.OnServerEvent:Connect(function(player, name)
print(player.Name .. " asked for " .. name)
end)
-- Her oyuncu, her yeniden doğuşunda bir kılıç alır
Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function()
local sword = ServerStorage.Sword:Clone()
sword.Parent = player.Backpack
sword.Activated:Connect(function()
swing(player)
end)
end)
end)
-- Antrenman kuklası: can çubuğu can durumuna göre değişir; yenilen
-- kukla bir süre sonra aynı yerde yeni bir kopya olarak geri gelir
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)
Roblox Oyunu: Savaş Arenası bölümündeki tüm dersler
Kendi başına pratik yap: Roblox playground