دمية التدريب
الدرس 5 من 20 في دورة لعبة Roblox: ساحات القتال على Coddy.
يحتاج الدمية إلى أمرين لتكون دمية تدريب: شريط صحة، وأن تعود عند هزيمتها.
إن HealthBar عبارة عن BillboardGui يحتوي على Fill أخضر داخل Back داكن. تجعل UDim2.fromScale(health / MaxHealth, 1) عرض التعبئة مساويًا لمقدار الصحة المتبقية.
عندما يموت Humanoid الخاص بها (Died)، تذكّر موضع وقوفها (GetPivot)، وأزلها، وانتظر عددًا من الثواني يساوي Settings.DummyRespawn، ثم ضع نسخة جديدة من ServerStorage في مكانها. تحتاج النسخة الجديدة إلى الإعداد نفسه، لذا يكون الإعداد دالة تستدعي نفسها للدمية الجديدة:
local function setupDummy(dummy)
-- شريط الصحة، وعند Died: ... setupDummy(fresh)
end
setupDummy(workspace.Dummy)التحدي
سهلفي نهاية السكربت، اكتب setupDummy(dummy):
- عند تغيّر صحة Humanoid، غيّر حجم
dummy.HealthBar.Back.Fillليتناسب مع الصحة المتبقية. - عند
Died: احتفظ بـdummy:GetPivot()، وانتظر 0.5 ثانية، ثم دمّره، وانتظرSettings.DummyRespawn، واستنسخServerStorage.Dummy، وانقله إلى ذلك الموضع، واجعله ابنًا لـ workspace، ثم أعد إعداده.
استدعِه مع workspace.Dummy. اضغط Play، ثم Check.
جرّب بنفسك
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> وقت آخر ضربة له
-- حركات السيف الخاصة بـ Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- ضربة بالسيف: تُشغَّل الحركة، ثم يُصاب كل من داخل الصندوق أمامك
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()
-- الصندوق أمامك، ولا يشمل جسمك أبدًا
local params = OverlapParams.new()
params.FilterDescendantsInstances = { character }
local box = root.CFrame * CFrame.new(0, 0, -3)
local hit = {} -- كل humanoid مرة واحدة في كل ضربة
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)
end
end
end
-- يحصل كل لاعب على Kills في لوحة المتصدرين، وعلى سيف في كل مرة يعود فيها إلى الحياة
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)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.