Hitbox
Lição 3 de 20 do curso Jogo de Roblox: Campos de batalha da Coddy.
Um golpe precisa acertar alguma coisa. A pergunta "o que está à minha frente?" é uma consulta espacial: workspace:GetPartBoundsInBox recebe uma caixa (um CFrame para o centro e um Vector3 para o tamanho) e retorna todas as partes que se sobrepõem a ela.
local box = root.CFrame * CFrame.new(0, 0, -3) -- 3 studs à frente
local parts = workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params)O modelo de uma parte contém o Humanoid, então part.Parent:FindFirstChildOfClass("Humanoid") indica se ela pertence a alguém que pode ser ferido.
Seus próprios braços também ficam nessa caixa. OverlapParams filtra a consulta: com seu personagem em FilterDescendantsInstances, a caixa nunca encontra seu próprio corpo.
Desafio
FácilNo final de swing:
- Crie um OverlapParams que exclua o personagem do jogador.
- Para cada parte em
GetPartBoundsInBoxde uma caixa a 3 studs à frente do root, com tamanhoSettings.HitboxSize: se o pai dela tiver um Humanoid,TakeDamage(Settings.SwordDamage).
Pressione Play e acerte o boneco de treinamento. Depois, Check.
Experimente você mesmo
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> quando atacou com a espada pela última vez
-- Animações de espada do próprio Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Um golpe: a animação é executada no máximo uma vez por SwingCooldown
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()
end
-- Todo jogador recebe Kills no placar e uma espada a cada vida
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)
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.