→ همه‌ی آموزش‌ها
آموزش 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 هر جا این آموزش Ctrl می‌گوید، کلید Cmd را بزن.
این قدم برای من کار نمی‌کند

اول این سه چیز را بررسی کن

  • اسم هر قطعه و اسکریپت دقیقاً مثل آموزش است، با همان حروف بزرگ.
  • اسکریپت داخل شیء درست است. به برچسب بالای کادر کد نگاه کن.
  • پنجره‌ی Output را از منوی Window باز کن. متن قرمز اسکریپت و خطی را که مشکل دارد نشان می‌دهد.

هنوز گیر کرده‌ای؟ برای ما بنویس ←

2
قدم 2 / 8

مسیر را بساز

  1. یک Part بگذار. Size را 6, 1, 6 کن، Anchored را روشن کن و آن را بکش داخل پوشه‌ی Path. اسمش را 1 بگذار.
  2. با Ctrl+D کپی‌اش کن و کپی را حدود 30 studs دورتر ببر. اسمش را 2 بگذار.
  3. آن‌قدر تکرار کن تا 5 Part با اسم‌های 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 تازه کلیک کن، بعد در Properties مقدار Name را Health و Value را 3 کن.
  • بعد از اینکه Enemy را داخل ServerStorage کشیدی، از Viewport ناپدید می‌شود. این درست است.
نکته. دشمن Anchored است چون یک اسکریپت آن را حرکت می‌دهد. Part های Anchored جاذبه و هل دادن را نادیده می‌گیرند.
این قدم برای من کار نمی‌کند

اول این سه چیز را بررسی کن

  • اسم هر قطعه و اسکریپت دقیقاً مثل آموزش است، با همان حروف بزرگ.
  • اسکریپت داخل شیء درست است. به برچسب بالای کادر کد نگاه کن.
  • پنجره‌ی 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 اضافه کن با Size برابر {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 health از دست می‌دهد.
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 کم می‌کند.
  • وقتی Health به 0 برسد، Destroy دشمن را پاک می‌کند.

جزئیات بیشتر

  • برج را 8 تا 12 studs دورتر از مسیر بگذار. برد در هر جهت 25 studs است.
  • یک برج برای یک دشمن 3 ثانیه وقت می‌گیرد و هر 3 ثانیه یک دشمن تازه می‌آید. پس یک برج فقط وقتی می‌تواند مسیر را نگه دارد که دشمن‌ها به اندازه‌ی کافی در برد بمانند.
  • برق سفید یک دهم ثانیه طول می‌کشد. خوب نگاه کن تا ببینی.
  • برای برج دوم، Tower را انتخاب کن و Ctrl+D را بزن، بعد کپی را جابه‌جا کن. اسکریپت هم با آن می‌آید.
نکته. برج کنار پیچ بهتر کار می‌کند، چون دشمن‌ها آنجا مدت بیشتری در برد می‌مانند.
این قدم برای من کار نمی‌کند

اول این سه چیز را بررسی کن

  • اسم هر قطعه و اسکریپت دقیقاً مثل آموزش است، با همان حروف بزرگ.
  • اسکریپت داخل شیء درست است. به برچسب بالای کادر کد نگاه کن.
  • پنجره‌ی Output را از منوی Window باز کن. متن قرمز اسکریپت و خطی را که مشکل دارد نشان می‌دهد.

هنوز گیر کرده‌ای؟ برای ما بنویس ←

7
قدم 7 / 8

امتحان کن و تعادلش را درست کن

  1. F5 را بزن و چند موج را تماشا کن.
  2. اگر هیچ دشمنی به پایگاه نمی‌رسد، بازی خیلی آسان است. اگر پایگاه زود همه‌ی health اش را از دست می‌دهد، خیلی سخت است.
  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 health بده و کاری کن هر دشمن 2 تا کم کند.