Hitbox
Bài học 3 trên 25 trong khóa học Trò chơi Roblox: Đấu trường của Coddy.
Một cú vung kiếm phải đánh trúng thứ gì đó. Câu hỏi “có gì ở phía trước mình?” là một truy vấn không gian: workspace:GetPartBoundsInBox nhận một hình hộp (một CFrame cho tâm và một Vector3 cho kích thước), rồi trả về mọi bộ phận giao với hình hộp đó.
local box = root.CFrame * CFrame.new(0, 0, -3) -- 3 stud phía trước
local parts = workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params)Mô hình của một bộ phận chứa Humanoid, vì vậy part.Parent:FindFirstChildOfClass("Humanoid") cho biết bộ phận đó có thuộc về người có thể bị gây sát thương hay không.
Cánh tay của bạn cũng nằm trong hình hộp đó. OverlapParams lọc truy vấn: khi nhân vật của bạn nằm trong FilterDescendantsInstances, hình hộp sẽ không tìm thấy cơ thể của chính bạn.
Thử thách
DễKhi vung kiếm, hãy gây sát thương cho bất kỳ ai đứng trước mặt bạn.
- Ở cuối
swing, hãy tạoOverlapParamsvớiFilterDescendantsInstances = { character }. - Với mỗi bộ phận trong
GetPartBoundsInBoxcủaroot.CFrame * CFrame.new(0, 0, -3), có kích thướcSettings.HitboxSize: nếu đối tượng cha của bộ phận đó có Humanoid, hãy gọiTakeDamage(Settings.SwordDamage). - Sau đó, gọi
print(humanoid.Parent.Name .. " is at " .. humanoid.Health).
Nhấn Chơi rồi đánh hình nộm: Đầu ra sẽ hiển thị lượng máu giảm dần. Sau đó, nhấn Kiểm tra.
Tự làm thử
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player: thời điểm vung kiếm gần nhất
-- Hoạt ảnh vung kiếm có sẵn của Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Một lần vung kiếm: phát hoạt ảnh, không quá một lần trong mỗi khoảng 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()
-- Bài học 3: thêm vùng va chạm ở đây
end
-- Mỗi người chơi nhận một thanh kiếm mỗi lần hồi sinh
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)
Tất cả bài học trong Trò chơi Roblox: Đấu trường
Tự luyện tập: Playground Roblox