Hitbox
Lección 3 de 20 del curso Juego de Roblox: Combates en la arena de Coddy.
Un golpe tiene que alcanzar algo. La pregunta «¿qué hay delante de mí?» es una consulta espacial: workspace:GetPartBoundsInBox toma una caja (un CFrame para su centro y un Vector3 para su tamaño) y devuelve cada pieza que se superpone con ella.
local box = root.CFrame * CFrame.new(0, 0, -3) -- 3 studs delante
local parts = workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params)El modelo de una pieza contiene el Humanoid, así que part.Parent:FindFirstChildOfClass("Humanoid") indica si pertenece a alguien que puede recibir daño.
Tus propios brazos también están en esa caja. OverlapParams filtra la consulta: si incluyes tu personaje en FilterDescendantsInstances, la caja nunca encuentra tu propio cuerpo.
Desafío
FácilAl final de swing:
- Crea OverlapParams que excluya el personaje del jugador.
- Para cada pieza en
GetPartBoundsInBoxde una caja situada 3 studs delante de la raíz, con el tamañoSettings.HitboxSize: si su padre tiene un Humanoid,TakeDamage(Settings.SwordDamage).
Pulsa Play y golpea al muñeco de entrenamiento. Después, Check.
Pruébalo tú mismo
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> cuándo blandió la espada por última vez
-- Animaciones de espada propias de Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Un golpe de espada: la animación, como máximo una vez por cada 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
-- Cada jugador recibe Kills en la tabla de clasificación y una espada en 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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.