← সব গাইড
গাইড 4

তোমার প্রথম tower defense বানাও

শত্রুরা একটা পথ ধরে তোমার ঘাঁটির দিকে হেঁটে যায়, আর একটা টাওয়ার সবচেয়ে কাছের শত্রুটাকে গুলি করে।

বিনামূল্যে60 মিনিট · শুরুর স্তর · Roblox Studio
1
ধাপ 1 / 8

place টা তৈরি করো

  1. Roblox Studio খোলো, New Experience এ ক্লিক করো আর Baseplate টেমপ্লেটটা বেছে নাও।
  2. Explorer এ Workspace এর উপর মাউস রাখো, + এ ক্লিক করে একটা Folder যোগ করো। নাম দাও Path।
  3. Workspace এ দ্বিতীয় একটা Folder যোগ করো আর নাম দাও Enemies। এটা খালি রেখে দাও। গেম চলার সময় শত্রুরা এর ভেতরে আসবে।

আরও বিস্তারিত

  • Baseplate টেমপ্লেটটা শুরুর স্ক্রিনের টেমপ্লেটের তালিকায় আছে।
  • + এ ক্লিক করে Folder শব্দটা লিখলে তাড়াতাড়ি পাবে। folder-এর নাম F2 দিয়ে বদলাও।
  • নাম দুটো অবশ্যই Path আর Enemies হবে, প্রথম অক্ষর বড় হাতের। স্ক্রিপ্টগুলো এই নামগুলোই খোঁজে।
  • Mac-এ এই গাইডে যেখানেই Ctrl লেখা আছে, সেখানে প্রতিবার Cmd কী ব্যবহার করো।
এই ধাপটা আমার জন্য কাজ করছে না

আগে এই তিনটা জিনিস দেখে নাও

  • প্রতিটা part আর স্ক্রিপ্টের নাম ঠিক গাইডের মতো, একই বড় হাতের আর ছোট হাতের অক্ষরসহ।
  • স্ক্রিপ্টটা ঠিক অবজেক্টের ভেতরে আছে। কোডের বাক্সের উপরের লেবেলটা দেখো।
  • Window মেনু থেকে Output উইন্ডো খোলো। লাল লেখা দেখায় কোন স্ক্রিপ্টে আর কোন লাইনে সমস্যা।

তবুও আটকে আছ? আমাদের লেখো →

2
ধাপ 2 / 8

পথটা বানাও

  1. একটা Part যোগ করো। Size করো 6, 1, 6, Anchored চালু করো আর সেটা Path ফোল্ডারে টেনে আনো। নাম দাও 1।
  2. Ctrl+D দিয়ে কপি করো আর কপিটা প্রায় 30 studs দূরে সরাও। নাম দাও 2।
  3. যতক্ষণ না 1, 2, 3, 4 আর 5 নামের 5টা part হয় ততক্ষণ এভাবে করতে থাকো। এমনভাবে বসাও যেন পথে কয়েকটা বাঁক থাকে।
  4. শত্রুরা 1 থেকে 2, তারপর 3 এভাবে যাবে, প্রতি জোড়ার মাঝে সোজা লাইনে।

আরও বিস্তারিত

  • কোনো part folder-এ ঢোকাতে Explorer-এ তার নাম টেনে Path নামের উপর ছেড়ে দাও।
  • Ctrl+D দিয়ে বানানো কপি আগে থেকেই Path folder-এর ভেতরে থাকে। শুধু সেটা সরাতে আর নাম বদলাতে হবে।
  • নামগুলো শুধু সংখ্যা: 1, 2, 3, 4, 5। কোনো অক্ষর নয়, কোনো ফাঁকও নয়।
  • অংশগুলো মেঝেতে পড়ে থাকতে দাও। শত্রুরা সেগুলোর 2 studs উপরে ভাসে।
সাধারণ ভুল. কোনো সংখ্যা বাদ দেওয়া। 3 নম্বর part না থাকলে শত্রুরা 2 নম্বরে এসে থেমে যায় আর স্ক্রিপ্ট ভুল দেখায়।
এই ধাপটা আমার জন্য কাজ করছে না

আগে এই তিনটা জিনিস দেখে নাও

  • প্রতিটা part আর স্ক্রিপ্টের নাম ঠিক গাইডের মতো, একই বড় হাতের আর ছোট হাতের অক্ষরসহ।
  • স্ক্রিপ্টটা ঠিক অবজেক্টের ভেতরে আছে। কোডের বাক্সের উপরের লেবেলটা দেখো।
  • Window মেনু থেকে Output উইন্ডো খোলো। লাল লেখা দেখায় কোন স্ক্রিপ্টে আর কোন লাইনে সমস্যা।

তবুও আটকে আছ? আমাদের লেখো →

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-এর একটা চেকবক্স। টিক না থাকলে খেলোয়াড় আর অন্য part শত্রুর ভেতর দিয়ে চলে যায়।
  • + এ ক্লিক করে IntValue লেখো, তাহলে পেয়ে যাবে। নতুন IntValue-তে ক্লিক করো, তারপর Properties-এ Name বদলে Health আর Value বদলে 3 করো।
  • Enemy-কে ServerStorage-এ টেনে নেওয়ার পর সেটা Viewport থেকে চলে যায়। এটা ঠিকই আছে।
টিপ. শত্রু anchored, কারণ একটা স্ক্রিপ্ট তাকে সরায়। Anchored part মাধ্যাকর্ষণ আর ধাক্কা গায়ে মাখে না।
এই ধাপটা আমার জন্য কাজ করছে না

আগে এই তিনটা জিনিস দেখে নাও

  • প্রতিটা part আর স্ক্রিপ্টের নাম ঠিক গাইডের মতো, একই বড় হাতের আর ছোট হাতের অক্ষরসহ।
  • স্ক্রিপ্টটা ঠিক অবজেক্টের ভেতরে আছে। কোডের বাক্সের উপরের লেবেলটা দেখো।
  • Window মেনু থেকে Output উইন্ডো খোলো। লাল লেখা দেখায় কোন স্ক্রিপ্টে আর কোন লাইনে সমস্যা।

তবুও আটকে আছ? আমাদের লেখো →

4
ধাপ 4 / 8

ঘাঁটিটা বানাও

  1. পথের শেষে, 5 নম্বর part এর পাশে একটা বড় Part যোগ করো। Anchored চালু করো আর নাম দাও Base।
  2. Base এর উপর মাউস রাখো, + এ ক্লিক করে একটা IntValue যোগ করো। নাম দাও Health আর এর Value করো 10।
  3. Base এ একটা BillboardGui যোগ করো, Size {0, 200}, {0, 50} আর StudsOffset 0, 8, 0 দিয়ে। এর ভেতরে একটা TextLabel যোগ করো, Size {1, 0}, {1, 0} দিয়ে আর TextScaled চালু রেখে।
  4. Base এ একটা Script যোগ করো আর এই কোডটা পেস্ট করো।
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()

প্রতিটা অংশ কী করে

  • Health মান বদলালেই Changed চলে।
  • update ফাংশনটা ঘাঁটির উপরের লেবেলে নতুন সংখ্যাটা লিখে দেয়।
  • Health 0 হয়ে গেলে লেবেলে Game over দেখা যায়, আর Waves স্ক্রিপ্ট শত্রু পাঠানো বন্ধ করে দেয়।

আরও বিস্তারিত

  • 10, 10, 10 আকারটা একটা ভালো বেস। যেকোনো রং চলবে।
  • বেসের Health আর শত্রুর Health আলাদা অবজেক্ট। প্রতিটা নিজের part-এর ভেতরে থাকে।
  • Size আর StudsOffset-এর জন্য সংখ্যাগুলো ঠিক যেমন দেখানো আছে তেমন লেখো, বন্ধনী আর কমাসহ, আর Enter চাপো।
  • টেস্ট করতে F5 চাপো। বেসের উপরের লেবেলে Base: 10 দেখায়।
এই ধাপটা আমার জন্য কাজ করছে না

আগে এই তিনটা জিনিস দেখে নাও

  • প্রতিটা part আর স্ক্রিপ্টের নাম ঠিক গাইডের মতো, একই বড় হাতের আর ছোট হাতের অক্ষরসহ।
  • স্ক্রিপ্টটা ঠিক অবজেক্টের ভেতরে আছে। কোডের বাক্সের উপরের লেবেলটা দেখো।
  • Window মেনু থেকে Output উইন্ডো খোলো। লাল লেখা দেখায় কোন স্ক্রিপ্টে আর কোন লাইনে সমস্যা।

তবুও আটকে আছ? আমাদের লেখো →

5
ধাপ 5 / 8

ওয়েভ পাঠাও

  1. ServerScriptService এর উপর মাউস রাখো, + এ ক্লিক করে একটা Script যোগ করো। নাম দাও Waves।
  2. ওখানে আগে থেকে যে লাইনটা আছে সেটা মুছে ফেলো আর এই কোডটা পেস্ট করো।
  3. Play চাপো। প্রতি 3 সেকেন্ডে 1 নম্বর part এ একটা লাল বল দেখা দেবে আর পথ ধরে চলবে। শেষে পৌঁছালে ঘাঁটির 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 ServerStorage থেকে Enemy টেমপ্লেটের একটা কপি বানায়।
  • walk ফাংশন শত্রুকে পথের প্রতিটা part এ ক্রমানুসারে নিয়ে যায়। distance / SPEED লম্বা আর ছোট দুই রকম দূরত্বেই গতি একই রাখে।
  • task.spawn প্রতিটা শত্রুকে নিজে নিজে হাঁটতে দেয়, তাই লুপটা নতুন শত্রু পাঠাতে থাকতে পারে।

আরও বিস্তারিত

  • স্ক্রিপ্টটা একটা নতুন ট্যাবে খোলে। কোডের ভেতরে ক্লিক করো, Ctrl+A আর তারপর Ctrl+V চেপে সবকিছু বদলে দাও।
  • গেম চলার সময় Enemies folder-এর ভেতরে শত্রুরা দেখা দেয়। তুমি Explorer-এ সেগুলো দেখতে পারো।
  • এখনো কোনো টাওয়ার নেই, তাই প্রতিটা শত্রু বেসে পৌঁছে যায়। 10টা শত্রুর পর লেবেলে Game over দেখায় আর নতুন শত্রু আসে না।
  • Output-এ কোনো নাম পাওয়া যাচ্ছে না বলে লাল লেখা এলে বুঝবে পথের কোনো part বা folder-এর নাম ভুল।
এই ধাপটা আমার জন্য কাজ করছে না

আগে এই তিনটা জিনিস দেখে নাও

  • প্রতিটা part আর স্ক্রিপ্টের নাম ঠিক গাইডের মতো, একই বড় হাতের আর ছোট হাতের অক্ষরসহ।
  • স্ক্রিপ্টটা ঠিক অবজেক্টের ভেতরে আছে। কোডের বাক্সের উপরের লেবেলটা দেখো।
  • Window মেনু থেকে Output উইন্ডো খোলো। লাল লেখা দেখায় কোন স্ক্রিপ্টে আর কোন লাইনে সমস্যা।

তবুও আটকে আছ? আমাদের লেখো →

6
ধাপ 6 / 8

টাওয়ার বানাও

  1. পথের একটা বাঁকের কাছে একটা Part যোগ করো। Size করো 4, 8, 4, Anchored চালু করো আর নাম দাও Tower।
  2. Tower এ একটা Script যোগ করো আর এই কোডটা পেস্ট করো।
  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 চাপো, তারপর কপিটা সরাও। স্ক্রিপ্টটা সঙ্গে চলে আসে।
টিপ. টাওয়ার বাঁকের পাশে সবচেয়ে ভালো কাজ করে, কারণ সেখানে শত্রুরা বেশিক্ষণ নাগালের মধ্যে থাকে।
এই ধাপটা আমার জন্য কাজ করছে না

আগে এই তিনটা জিনিস দেখে নাও

  • প্রতিটা part আর স্ক্রিপ্টের নাম ঠিক গাইডের মতো, একই বড় হাতের আর ছোট হাতের অক্ষরসহ।
  • স্ক্রিপ্টটা ঠিক অবজেক্টের ভেতরে আছে। কোডের বাক্সের উপরের লেবেলটা দেখো।
  • Window মেনু থেকে Output উইন্ডো খোলো। লাল লেখা দেখায় কোন স্ক্রিপ্টে আর কোন লাইনে সমস্যা।

তবুও আটকে আছ? আমাদের লেখো →

7
ধাপ 7 / 8

টেস্ট করো আর ভারসাম্য ঠিক করো

  1. F5 চাপো আর কয়েকটা ওয়েভ দেখো।
  2. কোনো শত্রু যদি কখনো ঘাঁটিতে না পৌঁছায়, তাহলে গেমটা বেশি সহজ। ঘাঁটির সব health যদি তাড়াতাড়ি শেষ হয়ে যায়, তাহলে বেশি কঠিন।
  3. তিনটা সংখ্যা দিয়ে ভারসাম্য ঠিক করো: Waves এর অপেক্ষার সময়, শত্রুর Health মান আর টাওয়ারের DAMAGE।
  4. থামাতে Shift+F5 চাপো। কিছু কাজ না করলে Window মেনু থেকে Output উইন্ডো খোলো আর লাল লেখাটা পড়ো।

আরও বিস্তারিত

  • একবারে শুধু একটা সংখ্যা বদলাও, তারপর আবার খেলো। নইলে বুঝবে না কোন বদলটা কাজে লেগেছে।
  • অপেক্ষার সময় হলো Waves স্ক্রিপ্টের শেষের কাছে task.wait(3)-এর সংখ্যাটা। ছোট সংখ্যা শত্রুদের তাড়াতাড়ি পাঠায়।
  • শত্রুর Health আছে ServerStorage-এ, Enemy-র ভেতরে। টাওয়ারের DAMAGE আছে Tower স্ক্রিপ্টের একদম উপরে।
  • প্রথম একটা ভালো লক্ষ্য: দুটো টাওয়ার দিয়ে বেসটা দুই মিনিট টিকে থাকুক।
এই ধাপটা আমার জন্য কাজ করছে না

আগে এই তিনটা জিনিস দেখে নাও

  • প্রতিটা part আর স্ক্রিপ্টের নাম ঠিক গাইডের মতো, একই বড় হাতের আর ছোট হাতের অক্ষরসহ।
  • স্ক্রিপ্টটা ঠিক অবজেক্টের ভেতরে আছে। কোডের বাক্সের উপরের লেবেলটা দেখো।
  • Window মেনু থেকে Output উইন্ডো খোলো। লাল লেখা দেখায় কোন স্ক্রিপ্টে আর কোন লাইনে সমস্যা।

তবুও আটকে আছ? আমাদের লেখো →

8
ধাপ 8 / 8

পাবলিশ করো

  1. File → Publish to Roblox বেছে নাও। গেমের একটা নাম আর ছোট বর্ণনা দাও।
  2. Creator Hub ওয়েবসাইটে তোমার গেমটা খোলো আর Maturity প্রশ্নমালা পূরণ করো।
  3. গেমটাকে Public করো আর লিংকটা একজন বন্ধুকে পাঠাও।

আরও বিস্তারিত

  • প্রথমবার পাবলিশ করার সময় Studio একটা নাম আর বর্ণনা চায়। Create-এ ক্লিক করো।
  • Creator Hub হলো create.roblox.com ওয়েবসাইট। একই অ্যাকাউন্ট দিয়ে সাইন ইন করো আর তালিকায় তোমার গেমে ক্লিক করো।
  • গেম সবার জন্য খোলার আগে Roblox আরও কিছু চাইতে পারে, যেমন অ্যাকাউন্টের বয়স যাচাই। পাতাটা বলে দেয় কী বাকি আছে।
  • তোমার বয়স 18-র কম হলে এই ধাপটা বাবা-মায়ের কারও সঙ্গে মিলে করো।
টিপ. গেমটা একজন বন্ধুকে দেখাও আর একটাই প্রশ্ন করো: বেশি সহজ ছিল, না বেশি কঠিন? তারপর একটা সংখ্যা বদলাও আর আবার টেস্ট করো।
এই ধাপটা আমার জন্য কাজ করছে না

আগে এই তিনটা জিনিস দেখে নাও

  • প্রতিটা part আর স্ক্রিপ্টের নাম ঠিক গাইডের মতো, একই বড় হাতের আর ছোট হাতের অক্ষরসহ।
  • স্ক্রিপ্টটা ঠিক অবজেক্টের ভেতরে আছে। কোডের বাক্সের উপরের লেবেলটা দেখো।
  • Window মেনু থেকে Output উইন্ডো খোলো। লাল লেখা দেখায় কোন স্ক্রিপ্টে আর কোন লাইনে সমস্যা।

তবুও আটকে আছ? আমাদের লেখো →

এবার নিজে বদলে দেখো

  • ছোট নাগালের আর DAMAGE 2 এর একটা দ্বিতীয় টাওয়ার যোগ করো।
  • ওয়েভগুলো সময়ের সঙ্গে দ্রুত করো। ইঙ্গিত: অপেক্ষার সময়টা একটা ভ্যারিয়েবলে রাখো আর প্রতিটা শত্রুর পর সেটা একটু ছোট করো।
  • ঘাঁটিকে 20 health দাও আর প্রতিটা শত্রু 2 করে কমাক।