Menu
CoddyTech

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.

challenge icon

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.

  1. Ở cuối swing, hãy tạo OverlapParams với FilterDescendantsInstances = { character }.
  2. Với mỗi bộ phận trong GetPartBoundsInBox của root.CFrame * CFrame.new(0, 0, -3), có kích thước Settings.HitboxSize: nếu đối tượng cha của bộ phận đó có Humanoid, hãy gọi TakeDamage(Settings.SwordDamage).
  3. 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