← 所有教學
第 4 篇教學

做出你的第一個 Tower Defense

敵人沿著路徑走向你的基地,防禦塔會射擊最近的那一個。

免費60 分鐘 · 初學者 · Roblox Studio
1
步驟 1 / 8

設定場景

  1. 打開 Roblox Studio,點 New Experience,然後選 Baseplate 範本。
  2. 在 Explorer 把滑鼠移到 Workspace 上,點 +,新增一個 Folder。把它命名為 Path。
  3. 在 Workspace 再新增第二個 Folder,命名為 Enemies。先讓它空著。遊戲進行時,敵人會出現在裡面。

更多細節

  • Baseplate 範本在開始畫面的範本清單裡。
  • 點 + 之後,輸入 Folder 這個字可以很快找到它。用 F2 替資料夾改名。
  • 名稱必須剛好是 Path 和 Enemies,第一個字母要大寫。腳本就是照這些名稱去找的。
  • 在 Mac 上,每當教學說 Ctrl 的時候,都改用 Cmd 鍵。
這一步我做不出來

先檢查這三件事

  • 每個零件和腳本的名字都要和教學裡的完全一樣,大小寫也要一樣。
  • 腳本要放在正確的物件裡面。看看程式碼框上方的標籤。
  • 從 Window 選單打開 Output 視窗。紅色的字會告訴你哪個腳本、哪一行有問題。

還是不行嗎?寫信給我們 →

2
步驟 2 / 8

做出路徑

  1. 新增一個 Part。把 Size 設成 6, 1, 6,打開 Anchored,並把它拖進 Path 這個 Folder。命名為 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 的地方。
常見的錯誤. 跳過某個數字。如果少了 3 號 Part,敵人會停在 2 號,而且腳本會顯示錯誤。
這一步我做不出來

先檢查這三件事

  • 每個零件和腳本的名字都要和教學裡的完全一樣,大小寫也要一樣。
  • 腳本要放在正確的物件裡面。看看程式碼框上方的標籤。
  • 從 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 裡的一個核取方塊。沒有打勾的話,玩家和其他零件會直接穿過敵人。
  • 點 + 之後,輸入 IntValue 就能找到它。點一下新的 IntValue,然後在 Properties 裡把 Name 改成 Health,把 Value 改成 3。
  • 把 Enemy 拖進 ServerStorage 之後,它就從 Viewport 裡消失了。這是對的。
小提示. 敵人要打開 Anchored,因為是由腳本來移動它。Anchored 的 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()

每一段在做什麼

  • Changed 會在 Health 這個值每次改變時執行。
  • update 函式會把新的數字寫到基地上方的標籤上。
  • 當 Health 變成 0 時,標籤會顯示 Game over,Waves 腳本也會停止派出敵人。

更多細節

  • 大小 10, 10, 10 的基地很合適。任何顏色都可以。
  • 基地的 Health 和敵人的 Health 是不同的物件。每一個都放在它自己的零件裡面。
  • 對於 Size 和 StudsOffset,完全照著給的樣子輸入數字,括號和逗號都要有,然後按 Enter。
  • 測試一下:按 F5。基地上方的標籤會顯示 Base: 10。
這一步我做不出來

先檢查這三件事

  • 每個零件和腳本的名字都要和教學裡的完全一樣,大小寫也要一樣。
  • 腳本要放在正確的物件裡面。看看程式碼框上方的標籤。
  • 從 Window 選單打開 Output 視窗。紅色的字會告訴你哪個腳本、哪一行有問題。

還是不行嗎?寫信給我們 →

5
步驟 5 / 8

派出敵人的波次

  1. 把滑鼠移到 ServerScriptService 上,點 +,新增一個 Script。把它命名為 Waves。
  2. 刪掉原本就有的那一行,貼上這段程式碼。
  3. 按 Play。每 3 秒會有一顆紅色的球出現在 1 號 Part,然後沿著路徑移動。它走到終點時,基地會損失 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 會從 ServerStorage 複製一份 Enemy 範本。
  • walk 函式會依照順序,把敵人移到每一個路徑 Part。distance / SPEED 可以讓敵人在長的和短的路段上速度都一樣。
  • task.spawn 讓每個敵人各自走自己的路,所以迴圈可以繼續派出新的敵人。

更多細節

  • 腳本會在新的分頁裡打開。點一下程式碼裡面,按 Ctrl+A,再按 Ctrl+V,取代所有內容。
  • 遊戲執行時,敵人會出現在 Enemies 資料夾裡。你可以在 Explorer 裡看到它們。
  • 如果還沒有防禦塔,每個敵人都會到達基地。10 個敵人之後,標籤會顯示 Game over,不會再有敵人出現。
  • 如果 Output 裡有紅色的字說找不到某個名稱,就表示某個路徑零件或某個資料夾的名稱錯了。
這一步我做不出來

先檢查這三件事

  • 每個零件和腳本的名字都要和教學裡的完全一樣,大小寫也要一樣。
  • 腳本要放在正確的物件裡面。看看程式碼框上方的標籤。
  • 從 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 降到 0,Destroy 就會移除這個敵人。

更多細節

  • 把防禦塔放在離路徑 8 到 12 studs 的地方。射程是往四面八方各 25 studs。
  • 一座防禦塔要用 3 秒對付一個敵人,而每 3 秒就會來一個新敵人。所以,只有當敵人在射程內停留得夠久,一座防禦塔才能守住這條路。
  • 白色的閃光只持續十分之一秒。要仔細看才看得到。
  • 要做第二座防禦塔,就選取 Tower,按 Ctrl+D,然後移動複製品。腳本會跟著一起過來。
小提示. 防禦塔放在轉彎旁邊最好用,因為敵人在那裡會停留在範圍內比較久。
這一步我做不出來

先檢查這三件事

  • 每個零件和腳本的名字都要和教學裡的完全一樣,大小寫也要一樣。
  • 腳本要放在正確的物件裡面。看看程式碼框上方的標籤。
  • 從 Window 選單打開 Output 視窗。紅色的字會告訴你哪個腳本、哪一行有問題。

還是不行嗎?寫信給我們 →

7
步驟 7 / 8

測試並調整難度

  1. 按 F5,看幾個波次。
  2. 如果沒有任何敵人到達基地,遊戲就太簡單了。如果基地很快就失去所有生命值,就太難了。
  3. 用三個數字來調整:Waves 裡的等待時間、敵人的 Health 值,還有防禦塔的 DAMAGE。
  4. 按 Shift+F5 停止。如果哪裡出錯,從 Window 選單打開 Output 視窗,看看紅色的字。

更多細節

  • 一次只改一個數字,然後再玩一次。不然你就不知道是哪個改動有用。
  • 等待時間就是 Waves 腳本接近結尾的 task.wait(3) 裡的那個數字。數字越小,敵人出來得越快。
  • 敵人的 Health 在 ServerStorage 裡的 Enemy 裡面。防禦塔的 DAMAGE 在 Tower 腳本的最上面。
  • 一個不錯的第一個目標:用兩座防禦塔,讓基地撐過兩分鐘。
這一步我做不出來

先檢查這三件事

  • 每個零件和腳本的名字都要和教學裡的完全一樣,大小寫也要一樣。
  • 腳本要放在正確的物件裡面。看看程式碼框上方的標籤。
  • 從 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 歲,請和爸媽一起完成這一步。
小提示. 把遊戲給朋友玩,然後問一個問題:太簡單還是太難?接著改一個數字,再測試一次。
這一步我做不出來

先檢查這三件事

  • 每個零件和腳本的名字都要和教學裡的完全一樣,大小寫也要一樣。
  • 腳本要放在正確的物件裡面。看看程式碼框上方的標籤。
  • 從 Window 選單打開 Output 視窗。紅色的字會告訴你哪個腳本、哪一行有問題。

還是不行嗎?寫信給我們 →

現在自己改改看

  • 加上第二座防禦塔,射程短,DAMAGE 是 2。
  • 讓波次隨著時間越來越快。提示:把等待時間放在一個變數裡,每出一個敵人就讓它小一點點。
  • 讓基地有 20 點生命值,而且每個敵人會扣掉 2 點。