Menu
CoddyTech

Bangun Menara

Pelajaran 6 dari 18 dalam kursus Game Roblox: Tower Defense di Coddy.

Sekarang, bagian pemain. DefenseClient adalah LocalScript di dalam HUD, sebuah ScreenGui yang disalin Roblox ke layar setiap pemain. Frame Shop pada HUD berisi satu TextButton untuk setiap menara, dengan nama sesuai nama menara. Event Activated pada tombol aktif saat tombol diklik atau diketuk:

button.Activated:Connect(function()
	selected = button.Name
end)

Lalu, klik salah satu pad abu-abu untuk membangun menara yang dipilih di sana. Client membaca klik dari mouse (me:GetMouse(), event Button1Down dan Target-nya, yaitu bagian di bawah penunjuk), tetapi client tidak bisa membangun apa pun sendiri: menara berada di server. Client mengirim permintaan melalui RemoteEvent Remotes.Place:

-- client
remotes.Place:FireServer(pad, "Archer")
-- server: Roblox menambahkan player terlebih dahulu
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
end)

Model menara menunggu di ServerStorage.Towers; server membuat salinan salah satunya di atas pad.

challenge icon

Tantangan

Sedang

Di DefenseClient:

  1. Ambil Players, Settings (dengan WaitForChild), local remotes = game.ReplicatedStorage:WaitForChild("Remotes"), local me = Players.LocalPlayer, dan local hud = script.Parent.
  2. Untuk setiap TextButton di hud.Shop, atur teksnya menjadi nama dan harga menara (Archer $60), lalu saat Activated, simpan menara itu di selected.
  3. Saat Button1Down pada mouse, jika target berada di workspace.Pads dan ada menara yang dipilih, panggil remotes.Place dengan pad dan nama menara.

Di DefenseServer: tambahkan local remotes dan local towers = workspace.Towers, tulis placeTower(pad, kind) (clone menara, gunakan PivotTo untuk memindahkannya ke CFrame pad yang dinaikkan setengah tinggi pad ditambah 1, lalu jadikan towers sebagai parent-nya), dan hubungkan remotes.Place.OnServerEvent ke fungsi tersebut.

Tekan Play, pilih menara, lalu klik pad. Setelah itu, tekan Periksa.

Coba sendiri

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local enemies = workspace.Enemies

print("The base can take " .. Settings.BaseHealth .. " hits")

-- Waypoint berurutan (bernama 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- Kesehatan markas sebagai atribut workspace: setiap client dapat membacanya
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Setiap pemain mendapat Money di papan peringkat
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local money = Instance.new("IntValue")
	money.Name = "Money"
	money.Value = Settings.StartMoney
	money.Parent = leaderstats
end)

-- Musuh mencapai markas
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
end

-- Gerakkan musuh menyusuri jalur. MoveTo berhenti mencoba setelah 8 detik dan melaporkannya
-- (MoveToFinished bernilai false), jadi musuh yang lambat digerakkan lagi hingga tiba.
local function walkPath(enemy)
	local humanoid = enemy.Humanoid
	for i = 2, #waypoints do
		repeat
			humanoid:MoveTo(waypoints[i].Position)
		until humanoid.MoveToFinished:Wait() or not enemy.Parent
		if not enemy.Parent then
			return
		end
	end
	-- Musuh mencapai markas
	damageBase(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- Musuh baru di gerbang, berjalan menyusuri jalur
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- Ditempatkan tepat di atas waypoint pertama
	enemy:PivotTo(waypoints[1].CFrame + Vector3.new(0, 5, 0))
	local info = Settings.Enemies[kind]
	enemy.Humanoid.MaxHealth = info.Health
	enemy.Humanoid.Health = info.Health
	enemy.Humanoid.WalkSpeed = info.Speed
	enemy.Parent = enemies
	task.spawn(walkPath, enemy)
	return enemy
end

-- Satu gelombang: munculkan musuh satu per satu, lalu tunggu sampai semuanya hilang
local function runWave(list)
	for _, kind in list do
		spawnEnemy(kind)
		task.wait(Settings.SpawnGap)
	end
	while #enemies:GetChildren() > 0 do
		task.wait(0.2)
	end
end

-- Gelombang demi gelombang, masing-masing setelah jeda
for i, list in Settings.Waves do
	task.wait(Settings.WaveBreak)
	runWave(list)
end
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Roblox: Tower Defense

Latihan sendiri: Playground Roblox