← บทเรียนทั้งหมด
บทเรียนที่ 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 แล้วลากเข้าไปในโฟลเดอร์ Path ตั้งชื่อว่า 1
  2. ทำสำเนาด้วย Ctrl+D แล้วย้ายสำเนาออกไปประมาณ 30 studs ตั้งชื่อว่า 2
  3. ทำซ้ำจนมี 5 พาร์ตที่ชื่อ 1, 2, 3, 4 และ 5 วางให้เส้นทางมีทางโค้งสักสองสามที่
  4. ศัตรูจะไปจาก 1 ไป 2 ไป 3 ต่อไปเรื่อยๆ เป็นเส้นตรงระหว่างแต่ละคู่

ดูรายละเอียดเพิ่ม

  • ถ้าจะใส่พาร์ตเข้าโฟลเดอร์ ให้ลากชื่อของมันใน Explorer ไปปล่อยบนชื่อ Path
  • สำเนาที่ทำด้วย Ctrl+D อยู่ในโฟลเดอร์ Path แล้ว เธอแค่ต้องย้ายมันและเปลี่ยนชื่อ
  • ชื่อก็คือตัวเลขล้วนๆ: 1, 2, 3, 4, 5 ไม่มีตัวอักษรและไม่มีเว้นวรรค
  • ปล่อยพาร์ตให้วางอยู่บนพื้น ศัตรูจะลอยอยู่เหนือมัน 2 studs
ข้อผิดพลาดที่พบบ่อย. ข้ามเลขไป ถ้าไม่มีพาร์ต 3 ศัตรูจะหยุดที่พาร์ต 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 เพราะมีสคริปต์คอยย้ายมัน พาร์ตที่ Anchored จะไม่สนแรงโน้มถ่วงและแรงผลัก
ขั้นนี้ใช้ไม่ได้สำหรับฉัน

ลองเช็กสามอย่างนี้ก่อน

  • ชื่อของพาร์ตและสคริปต์ทุกชิ้นต้องตรงกับในบทเรียนเป๊ะ รวมถึงตัวพิมพ์ใหญ่ด้วย
  • สคริปต์ต้องอยู่ในวัตถุที่ถูกต้อง ดูป้ายที่อยู่เหนือกล่องโค้ด
  • เปิดหน้าต่าง Output จากเมนู Window ข้อความสีแดงจะบอกว่าสคริปต์ไหนและบรรทัดไหนมีปัญหา

ยังติดอยู่ใช่ไหม? เขียนมาหาเราได้เลย →

4
ขั้นที่ 4 / 8

สร้างฐาน

  1. เพิ่ม 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 วินาทีจะมีลูกบอลสีแดงโผล่ที่พาร์ต 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 ย้ายศัตรูไปที่พาร์ตของเส้นทางตามลำดับ 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