→ كل الدروس
الدرس 4

اصنع أول Tower Defense لك

يمشي الأعداء على مسار نحو قاعدتك، ويطلق برج النار على أقربهم.

مجاني60 دقيقة · مبتدئ · Roblox Studio
1
الخطوة 1 / 8

جهّز المكان

  1. افتح Roblox Studio، واضغط New Experience واختر قالب Baseplate.
  2. في Explorer مرّر الفأرة فوق Workspace، واضغط + وأضف Folder. سمّه Path.
  3. أضف Folder ثانيًا إلى Workspace وسمّه Enemies. اتركه فارغًا. سيظهر الأعداء فيه أثناء اللعبة.

المزيد من التفاصيل

  • قالب Baseplate موجود في قائمة القوالب على شاشة البداية.
  • عندما تضغط +، اكتب الكلمة Folder لتجده بسرعة. وغيّر اسم المجلد بالمفتاح F2.
  • يجب أن يكون الاسمان Path وEnemies تمامًا، بحرف أول كبير. السكربتات تبحث عن هذين الاسمين.
  • على جهاز Mac استخدم المفتاح Cmd كلما قال هذا الدرس Ctrl.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

2
الخطوة 2 / 8

ابنِ المسار

  1. أضف Part. اجعل Size يساوي 6, 1, 6، وفعّل Anchored واسحبه إلى الـ Folder المسمى Path. سمّه 1.
  2. كرره بـ Ctrl+D وانقل النسخة نحو 30 studs بعيدًا. سمّها 2.
  3. كرر حتى يصير عندك 5 Parts أسماؤها 1 و2 و3 و4 و5. ضعها بحيث يكون في الطريق بعض المنعطفات.
  4. سيذهب الأعداء من 1 إلى 2 إلى 3 وهكذا، في خط مستقيم بين كل اثنين.

المزيد من التفاصيل

  • لتضع قطعة في المجلد، اسحب اسمها في Explorer إلى الاسم Path.
  • النسخة المصنوعة بـ Ctrl+D تكون داخل المجلد Path أصلًا. عليك فقط أن تحرّكها وتغيّر اسمها.
  • الأسماء هي الأرقام فقط: 1 و2 و3 و4 و5. بلا حروف وبلا مسافات.
  • اترك القطع ملقاة على الأرض. يطفو الأعداء على ارتفاع 2 studs فوقها.
خطأ شائع. أن تتخطى رقمًا. إذا كان الـ Part رقم 3 مفقودًا، يتوقف الأعداء عند الـ Part رقم 2 ويُظهر السكربت خطأً.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

3
الخطوة 3 / 8

اصنع العدو

  1. أضف Part. اجعل Shape يساوي Ball و Size يساوي 3, 3, 3، واجعله أحمر. فعّل Anchored، وأطفئ CanCollide وسمّه Enemy.
  2. مرّر الفأرة فوق Enemy، واضغط + وأضف IntValue. سمّه Health واجعل Value يساوي 3.
  3. اسحب Enemy إلى ServerStorage. صار الآن قالبًا. ستصنع اللعبة نسخًا منه.

المزيد من التفاصيل

  • Shape قائمة في Properties. اضغط عليها واختر Ball.
  • CanCollide مربع اختيار في Properties. وبلا علامة الصح، يمر اللاعبون والقطع الأخرى من خلال العدو.
  • عندما تضغط +، اكتب IntValue لتجده. اضغط على IntValue الجديد، ثم غيّر Name إلى Health وValue إلى 3 في Properties.
  • بعد أن تسحب Enemy إلى ServerStorage يختفي من Viewport. وهذا صحيح.
نصيحة. العدو مثبّت (Anchored) لأن سكربتًا هو الذي يحركه. الـ Parts المثبتة لا تتأثر بالجاذبية ولا بالدفع.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

4
الخطوة 4 / 8

ابنِ القاعدة

  1. أضف Part كبيرًا في نهاية المسار، بجانب الـ Part رقم 5. فعّل Anchored وسمّه Base.
  2. مرّر الفأرة فوق Base، واضغط + وأضف IntValue. سمّه Health واجعل Value يساوي 10.
  3. أضف BillboardGui إلى Base بحجم Size يساوي {0, 200}, {0, 50} و StudsOffset يساوي 0, 8, 0. وأضف داخله TextLabel بحجم {1, 0}, {1, 0} مع تفعيل TextScaled.
  4. أضف Script إلى Base والصق هذا الكود.
Base > Script
local base = script.Parent
local health = base.Health
local label = base.BillboardGui.TextLabel

local function update()
	if health.Value > 0 then
		label.Text = "Base: " .. health.Value
	else
		label.Text = "Game over"
	end
end

health.Changed:Connect(update)
update()

ماذا يفعل كل جزء

  • Changed تعمل في كل مرة تتغير فيها قيمة Health.
  • تكتب الدالة update الرقم الجديد على العنوان الذي فوق القاعدة.
  • عندما تصل Health إلى 0، يعرض العنوان Game over ويتوقف السكربت Waves عن إرسال الأعداء.

المزيد من التفاصيل

  • الحجم 10, 10, 10 أساس جيد. وأي لون يصلح.
  • Health القاعدة شيء مختلف عن Health العدو. كل واحد منهما داخل قطعته.
  • لضبط Size وStudsOffset اكتب الأرقام تمامًا كما هي، مع الأقواس والفواصل، ثم اضغط Enter.
  • للتجربة: اضغط F5. تعرض اللافتة فوق القاعدة Base: 10.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

5
الخطوة 5 / 8

أرسل الموجات

  1. مرّر الفأرة فوق ServerScriptService، واضغط + وأضف Script. سمّه Waves.
  2. احذف السطر الموجود فيه والصق هذا الكود.
  3. اضغط Play. كل 3 ثوانٍ تظهر كرة حمراء عند الـ Part رقم 1 وتتحرك على المسار. وعندما تصل إلى النهاية تفقد القاعدة 1 من الصحة.
ServerScriptService > Waves
local TweenService = game:GetService("TweenService")
local ServerStorage = game:GetService("ServerStorage")

local path = workspace:WaitForChild("Path")
local enemies = workspace:WaitForChild("Enemies")
local base = workspace:WaitForChild("Base")
local SPEED = 8

local function walk(enemy)
	for i = 2, #path:GetChildren() do
		local target = path[tostring(i)].Position + Vector3.new(0, 2, 0)
		local distance = (target - enemy.Position).Magnitude
		local info = TweenInfo.new(distance / SPEED, Enum.EasingStyle.Linear)
		local tween = TweenService:Create(enemy, info, {Position = target})
		tween:Play()
		tween.Completed:Wait()
		if not enemy.Parent then return end
	end

	base.Health.Value = math.max(0, base.Health.Value - 1)
	enemy:Destroy()
end

while base.Health.Value > 0 do
	task.wait(3)

	local enemy = ServerStorage.Enemy:Clone()
	enemy.Position = path["1"].Position + Vector3.new(0, 2, 0)
	enemy.Parent = enemies
	task.spawn(walk, enemy)
end

ماذا يفعل كل جزء

  • Clone تصنع نسخة من قالب Enemy الموجود في ServerStorage.
  • تنقل الدالة walk العدو إلى كل Part من المسار بالترتيب. و distance / SPEED تُبقي السرعة نفسها في المسافات الطويلة والقصيرة.
  • task.spawn تجعل كل عدو يمشي وحده، فتستطيع الحلقة أن تستمر في إرسال أعداء جدد.

المزيد من التفاصيل

  • يُفتح السكربت في تبويب جديد. اضغط داخل الكود، ثم Ctrl+A ثم Ctrl+V لتستبدل كل شيء.
  • تظهر الأعداء داخل المجلد Enemies أثناء تشغيل اللعبة. يمكنك مشاهدتها في Explorer.
  • بلا برج بعد، يصل كل عدو إلى القاعدة. بعد 10 أعداء تعرض اللافتة Game over ولا يأتي المزيد من الأعداء.
  • النص الأحمر عن اسم مفقود في Output يعني أن قطعة من المسار أو مجلدًا اسمه خاطئ.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

6
الخطوة 6 / 8

ابنِ البرج

  1. أضف Part قرب منعطف في المسار. اجعل Size يساوي 4, 8, 4، وفعّل Anchored وسمّه Tower.
  2. أضف Script إلى Tower والصق هذا الكود.
  3. اضغط Play. مرة كل ثانية يضرب البرج أقرب عدو داخل المدى. يومض العدو بالأبيض، وبعد 3 ضربات يختفي.
Tower > Script
local tower = script.Parent
local enemies = workspace:WaitForChild("Enemies")
local RANGE = 25
local DAMAGE = 1

while true do
	task.wait(1)

	local target = nil
	local closest = RANGE
	for _, enemy in ipairs(enemies:GetChildren()) do
		local distance = (enemy.Position - tower.Position).Magnitude
		if distance < closest then
			target = enemy
			closest = distance
		end
	end

	if target then
		target.Health.Value -= DAMAGE
		if target.Health.Value <= 0 then
			target:Destroy()
		else
			target.Color = Color3.new(1, 1, 1)
			task.wait(0.1)
			target.Color = Color3.fromRGB(255, 60, 60)
		end
	end
end

ماذا يفعل كل جزء

  • تقيس الحلقة المسافة من البرج إلى كل عدو وتتذكر الأقرب.
  • RANGE هو المدى الذي يصل إليه البرج. و DAMAGE هو مقدار الصحة التي تزيلها ضربة واحدة.
  • عندما تصل Health إلى 0، تزيل Destroy العدو.

المزيد من التفاصيل

  • ضع البرج على بعد 8 إلى 12 studs من المسار. المدى 25 studs في كل اتجاه.
  • يحتاج برج واحد إلى 3 ثوانٍ لعدو واحد، ويأتي عدو جديد كل 3 ثوانٍ. لذلك لا يستطيع برج واحد أن يسيطر على المسار إلا إذا بقيت الأعداء في المدى وقتًا كافيًا.
  • يستمر الوميض الأبيض عُشر ثانية. دقّق النظر لتراه.
  • لبرج ثانٍ، حدد Tower واضغط Ctrl+D، ثم حرّك النسخة. السكربت يأتي معها.
نصيحة. يعمل البرج أفضل بجانب منعطف، لأن الأعداء يبقون في المدى وقتًا أطول هناك.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

7
الخطوة 7 / 8

اختبر ووازن

  1. اضغط F5 وشاهد بضع موجات.
  2. إذا لم يصل أي عدو إلى القاعدة، فاللعبة سهلة جدًا. وإذا فقدت القاعدة كل صحتها بسرعة، فهي صعبة جدًا.
  3. وازنها بثلاثة أرقام: مدة الانتظار في Waves، وقيمة Health للعدو، وقيمة DAMAGE للبرج.
  4. اضغط Shift+F5 لتتوقف. إذا فشل شيء، افتح نافذة Output من قائمة Window واقرأ النص الأحمر.

المزيد من التفاصيل

  • غيّر رقمًا واحدًا فقط في كل مرة، ثم العب من جديد. وإلا فلن تعرف أي تغيير ساعد.
  • زمن الانتظار هو الرقم الموجود في task.wait(3) قرب نهاية سكربت Waves. الرقم الأصغر يرسل الأعداء أسرع.
  • Health العدو في ServerStorage، داخل Enemy. وDAMAGE البرج في أعلى سكربت Tower.
  • هدف أول جيد: أن تصمد القاعدة دقيقتين ببرجين.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

8
الخطوة 8 / 8

انشرها

  1. اختر File → Publish to Roblox. أعطِ اللعبة اسمًا ووصفًا قصيرًا.
  2. في موقع Creator Hub افتح لعبتك واملأ استبيان Maturity.
  3. اجعل اللعبة Public وأرسل الرابط إلى صديق.

المزيد من التفاصيل

  • في أول مرة تنشر فيها، يطلب Studio اسمًا ووصفًا. اضغط Create.
  • Creator Hub هو الموقع create.roblox.com. سجّل الدخول بالحساب نفسه واضغط على لعبتك في القائمة.
  • قد تطلب Roblox المزيد قبل أن تصبح اللعبة عامة، مثل التحقق من العمر على الحساب. تخبرك الصفحة بما ينقص.
  • إذا كان عمرك أقل من 18 سنة، فافعل هذه الخطوة مع أحد والديك.
نصيحة. أرِ اللعبة لصديق واسأله سؤالًا واحدًا: هل كانت سهلة جدًا أم صعبة جدًا؟ ثم غيّر رقمًا واحدًا واختبر مرة أخرى.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

الآن غيّره بنفسك

  • أضف برجًا ثانيًا بمدى قصير و DAMAGE يساوي 2.
  • اجعل الموجات أسرع مع الوقت. تلميح: احتفظ بمدة الانتظار في متغير واجعلها أصغر قليلًا بعد كل عدو.
  • اجعل للقاعدة 20 من الصحة واجعل كل عدو يزيل 2.