← Tất cả hướng dẫn
Hướng dẫn 4

Làm tower defense đầu tiên của bạn

Kẻ địch đi dọc theo một con đường về phía căn cứ của bạn, và một cái tháp bắn con gần nhất.

Miễn phí60 phút · Người mới · Roblox Studio
1
Bước 1 / 8

Chuẩn bị place

  1. Mở Roblox Studio, bấm New Experience và chọn mẫu Baseplate.
  2. Trong Explorer, rê chuột lên Workspace, bấm + và thêm một Folder. Đặt tên là Path.
  3. Thêm một Folder thứ hai vào Workspace và đặt tên là Enemies. Để trống. Kẻ địch sẽ xuất hiện trong đó khi đang chơi.

Xem thêm chi tiết

  • Mẫu Baseplate nằm trong danh sách các mẫu ở màn hình bắt đầu.
  • Khi bạn bấm +, gõ từ Folder để tìm nhanh. Đổi tên folder bằng F2.
  • Các tên phải đúng là Path và Enemies, chữ cái đầu viết hoa. Các script tìm theo những tên này.
  • Nếu dùng Mac, hãy dùng phím Cmd mỗi khi hướng dẫn này nói Ctrl.
Bước này không chạy được với mình

Hãy kiểm tra ba điều này trước

  • Tên của mọi part và script phải giống hệt trong hướng dẫn, kể cả chữ hoa.
  • Script phải nằm trong đúng vật thể. Hãy xem dòng nhãn phía trên khung code.
  • Mở cửa sổ Output từ menu Window. Chữ màu đỏ cho biết script nào và dòng nào bị lỗi.

Vẫn chưa được? Hãy viết thư cho chúng mình →

2
Bước 2 / 8

Xây con đường

  1. Thêm một Part. Đặt Size thành 6, 1, 6, bật Anchored và kéo nó vào folder Path. Đặt tên là 1.
  2. Nhân bản nó bằng Ctrl+D và dời bản sao đi khoảng 30 studs. Đặt tên là 2.
  3. Lặp lại cho đến khi có 5 part tên là 1, 2, 3, 4 và 5. Đặt chúng sao cho lộ trình có vài khúc rẽ.
  4. Kẻ địch sẽ đi từ 1 đến 2 đến 3 và cứ thế, theo đường thẳng giữa mỗi cặp.

Xem thêm chi tiết

  • Để đưa một part vào folder, kéo tên nó trong Explorer thả lên tên Path.
  • Bản sao làm bằng Ctrl+D đã nằm sẵn trong folder Path. Bạn chỉ cần dời nó đi và đổi tên.
  • Các tên chỉ là những con số: 1, 2, 3, 4, 5. Không có chữ cái và không có dấu cách.
  • Cứ để các part nằm trên sàn. Kẻ địch lơ lửng cao hơn chúng 2 studs.
Lỗi thường gặp. Bỏ sót một số. Nếu thiếu part 3, kẻ địch dừng ở part 2 và script báo lỗi.
Bước này không chạy được với mình

Hãy kiểm tra ba điều này trước

  • Tên của mọi part và script phải giống hệt trong hướng dẫn, kể cả chữ hoa.
  • Script phải nằm trong đúng vật thể. Hãy xem dòng nhãn phía trên khung code.
  • Mở cửa sổ Output từ menu Window. Chữ màu đỏ cho biết script nào và dòng nào bị lỗi.

Vẫn chưa được? Hãy viết thư cho chúng mình →

3
Bước 3 / 8

Tạo kẻ địch

  1. Thêm một Part. Đặt Shape thành Ball và Size thành 3, 3, 3, rồi cho nó màu đỏ. Bật Anchored, tắt CanCollide và đặt tên là Enemy.
  2. Rê chuột lên Enemy, bấm + và thêm một IntValue. Đặt tên là Health và đặt Value thành 3.
  3. Kéo Enemy vào ServerStorage. Giờ nó là một bản mẫu. Game sẽ tạo ra các bản sao của nó.

Xem thêm chi tiết

  • Shape là một danh sách trong Properties. Bấm vào nó và chọn Ball.
  • CanCollide là một ô đánh dấu trong Properties. Không có dấu tích thì người chơi và các part khác đi xuyên qua kẻ địch.
  • Khi bạn bấm +, gõ IntValue để tìm. Bấm vào IntValue mới, rồi trong Properties đổi Name thành Health và Value thành 3.
  • Sau khi bạn kéo Enemy vào ServerStorage, nó biến mất khỏi Viewport. Vậy là đúng.
Mẹo. Kẻ địch được Anchored vì có một script di chuyển nó. Part đã Anchored không bị trọng lực và lực đẩy tác động.
Bước này không chạy được với mình

Hãy kiểm tra ba điều này trước

  • Tên của mọi part và script phải giống hệt trong hướng dẫn, kể cả chữ hoa.
  • Script phải nằm trong đúng vật thể. Hãy xem dòng nhãn phía trên khung code.
  • Mở cửa sổ Output từ menu Window. Chữ màu đỏ cho biết script nào và dòng nào bị lỗi.

Vẫn chưa được? Hãy viết thư cho chúng mình →

4
Bước 4 / 8

Xây căn cứ

  1. Thêm một Part lớn ở cuối con đường, cạnh part 5. Bật Anchored và đặt tên là Base.
  2. Rê chuột lên Base, bấm + và thêm một IntValue. Đặt tên là Health và đặt Value thành 10.
  3. Thêm một BillboardGui vào Base với Size {0, 200}, {0, 50} và StudsOffset 0, 8, 0. Thêm một TextLabel vào trong nó với Size {1, 0}, {1, 0} và bật TextScaled.
  4. Thêm một Script vào Base và dán đoạn code này.
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()

Mỗi phần làm gì

  • Changed chạy mỗi khi giá trị Health thay đổi.
  • Hàm update ghi con số mới lên nhãn phía trên căn cứ.
  • Khi Health về 0, nhãn hiện Game over và script Waves ngừng gửi kẻ địch.

Xem thêm chi tiết

  • Kích thước 10, 10, 10 là một cơ sở tốt. Màu nào cũng được.
  • Health của căn cứ là một vật thể khác với Health của kẻ địch. Mỗi cái nằm trong part của riêng nó.
  • Với Size và StudsOffset, gõ các số đúng như được chỉ, kèm cả dấu ngoặc và dấu phẩy, rồi nhấn Enter.
  • Để thử: nhấn F5. Nhãn phía trên căn cứ hiện Base: 10.
Bước này không chạy được với mình

Hãy kiểm tra ba điều này trước

  • Tên của mọi part và script phải giống hệt trong hướng dẫn, kể cả chữ hoa.
  • Script phải nằm trong đúng vật thể. Hãy xem dòng nhãn phía trên khung code.
  • Mở cửa sổ Output từ menu Window. Chữ màu đỏ cho biết script nào và dòng nào bị lỗi.

Vẫn chưa được? Hãy viết thư cho chúng mình →

5
Bước 5 / 8

Gửi các đợt tấn công

  1. Rê chuột lên ServerScriptService, bấm + và thêm một Script. Đặt tên là Waves.
  2. Xóa dòng có sẵn rồi dán đoạn code này vào.
  3. Nhấn Play. Cứ 3 giây lại có một quả bóng đỏ xuất hiện ở part 1 và di chuyển dọc theo con đường. Khi nó tới cuối đường, căn cứ mất 1 máu.
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

Mỗi phần làm gì

  • Clone tạo một bản sao của bản mẫu Enemy từ ServerStorage.
  • Hàm walk đưa kẻ địch tới từng part của con đường theo thứ tự. distance / SPEED giữ tốc độ như nhau trên đoạn dài và đoạn ngắn.
  • task.spawn cho mỗi kẻ địch tự đi theo cách riêng của nó, nên vòng lặp có thể tiếp tục gửi kẻ địch mới.

Xem thêm chi tiết

  • Script mở ra trong một tab mới. Bấm vào trong code, nhấn Ctrl+A rồi Ctrl+V để thay thế tất cả.
  • Kẻ địch xuất hiện trong folder Enemies khi game chạy. Bạn có thể xem chúng trong Explorer.
  • Khi chưa có tháp, mọi kẻ địch đều đến được căn cứ. Sau 10 kẻ địch, nhãn hiện Game over và không còn kẻ địch nào đến nữa.
  • Chữ đỏ trong Output nói về một tên bị thiếu nghĩa là một part của đường đi hoặc một folder bị đặt sai tên.
Bước này không chạy được với mình

Hãy kiểm tra ba điều này trước

  • Tên của mọi part và script phải giống hệt trong hướng dẫn, kể cả chữ hoa.
  • Script phải nằm trong đúng vật thể. Hãy xem dòng nhãn phía trên khung code.
  • Mở cửa sổ Output từ menu Window. Chữ màu đỏ cho biết script nào và dòng nào bị lỗi.

Vẫn chưa được? Hãy viết thư cho chúng mình →

6
Bước 6 / 8

Xây tháp

  1. Thêm một Part gần một khúc rẽ của con đường. Đặt Size thành 4, 8, 4, bật Anchored và đặt tên là Tower.
  2. Thêm một Script vào Tower và dán đoạn code này.
  3. Nhấn Play. Mỗi giây một lần, tháp bắn trúng kẻ địch gần nhất trong tầm. Kẻ địch nháy trắng, và sau 3 lần trúng thì biến mất.
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

Mỗi phần làm gì

  • Vòng lặp đo khoảng cách từ tháp tới mọi kẻ địch và nhớ con gần nhất.
  • RANGE là tầm xa mà tháp với tới. DAMAGE là lượng máu mà một phát bắn trừ đi.
  • Khi Health xuống 0, Destroy xóa kẻ địch.

Xem thêm chi tiết

  • Đặt tháp cách đường đi 8 đến 12 studs. Tầm bắn là 25 studs theo mọi hướng.
  • Một tháp cần 3 giây để hạ một kẻ địch, và cứ 3 giây lại có một kẻ địch mới đến. Vì vậy một tháp chỉ giữ được đường đi nếu kẻ địch ở trong tầm đủ lâu.
  • Ánh chớp trắng chỉ kéo dài một phần mười giây. Hãy nhìn kỹ mới thấy.
  • Để làm tháp thứ hai, chọn Tower rồi nhấn Ctrl+D, sau đó dời bản sao đi. Script đi theo cùng nó.
Mẹo. Tháp hoạt động tốt nhất cạnh một khúc rẽ, vì ở đó kẻ địch ở trong tầm lâu hơn.
Bước này không chạy được với mình

Hãy kiểm tra ba điều này trước

  • Tên của mọi part và script phải giống hệt trong hướng dẫn, kể cả chữ hoa.
  • Script phải nằm trong đúng vật thể. Hãy xem dòng nhãn phía trên khung code.
  • Mở cửa sổ Output từ menu Window. Chữ màu đỏ cho biết script nào và dòng nào bị lỗi.

Vẫn chưa được? Hãy viết thư cho chúng mình →

7
Bước 7 / 8

Thử và cân bằng

  1. Nhấn F5 và xem vài đợt tấn công.
  2. Nếu không có kẻ địch nào tới được căn cứ, game quá dễ. Nếu căn cứ mất hết máu quá nhanh, game quá khó.
  3. Hãy cân bằng bằng ba con số: thời gian chờ trong Waves, giá trị Health của kẻ địch và DAMAGE của tháp.
  4. Nhấn Shift+F5 để dừng. Nếu có gì sai, hãy mở cửa sổ Output từ menu Window và đọc chữ màu đỏ.

Xem thêm chi tiết

  • Mỗi lần chỉ đổi một số, rồi chơi lại. Nếu không, bạn sẽ không biết thay đổi nào có tác dụng.
  • Thời gian chờ là số trong task.wait(3) gần cuối script Waves. Số nhỏ hơn thì kẻ địch đến nhanh hơn.
  • Health của kẻ địch nằm trong ServerStorage, bên trong Enemy. DAMAGE của tháp nằm ở đầu script Tower.
  • Một mục tiêu đầu tiên hay: căn cứ phải trụ được hai phút với hai tháp.
Bước này không chạy được với mình

Hãy kiểm tra ba điều này trước

  • Tên của mọi part và script phải giống hệt trong hướng dẫn, kể cả chữ hoa.
  • Script phải nằm trong đúng vật thể. Hãy xem dòng nhãn phía trên khung code.
  • Mở cửa sổ Output từ menu Window. Chữ màu đỏ cho biết script nào và dòng nào bị lỗi.

Vẫn chưa được? Hãy viết thư cho chúng mình →

8
Bước 8 / 8

Đăng game

  1. Chọn File → Publish to Roblox. Đặt tên cho game và viết một mô tả ngắn.
  2. Trên trang Creator Hub, mở game của bạn và điền bảng câu hỏi Maturity.
  3. Đặt game thành Public và gửi đường link cho một người bạn.

Xem thêm chi tiết

  • Lần đầu bạn đăng game, Studio hỏi tên và mô tả. Bấm Create.
  • Creator Hub là trang web create.roblox.com. Đăng nhập bằng cùng tài khoản và bấm vào game của bạn trong danh sách.
  • Roblox có thể yêu cầu thêm trước khi game được công khai, ví dụ kiểm tra độ tuổi của tài khoản. Trang sẽ cho bạn biết còn thiếu gì.
  • Nếu bạn dưới 18 tuổi, hãy làm bước này cùng với bố mẹ.
Mẹo. Cho một người bạn chơi thử và hỏi một câu: game quá dễ hay quá khó? Sau đó đổi một con số và thử lại.
Bước này không chạy được với mình

Hãy kiểm tra ba điều này trước

  • Tên của mọi part và script phải giống hệt trong hướng dẫn, kể cả chữ hoa.
  • Script phải nằm trong đúng vật thể. Hãy xem dòng nhãn phía trên khung code.
  • Mở cửa sổ Output từ menu Window. Chữ màu đỏ cho biết script nào và dòng nào bị lỗi.

Vẫn chưa được? Hãy viết thư cho chúng mình →

Giờ tự mình thay đổi nhé

  • Thêm một tháp thứ hai có tầm ngắn và DAMAGE 2.
  • Làm các đợt tấn công nhanh dần theo thời gian. Gợi ý: giữ thời gian chờ trong một biến và làm nó nhỏ đi một chút sau mỗi kẻ địch.
  • Cho căn cứ 20 máu và làm mỗi kẻ địch trừ 2.