Menu
CoddyTech

Nişan Al

Coddy'nin Roblox Oyunu: Kule Savunması kursunda ders 7 / 18.

Bir kule, Range içindeki alanı korur. Her kule kendi iş parçacığında kendi döngüsünü çalıştırır: menzil içindeki en yakın canlı düşmanı bulur ve Head parçasını ona bakacak şekilde döndürür.

En yakını bulmak klasik bir döngüdür: hiçbir şeyle ve en iyi mesafe olarak menzille başla, ardından şimdiye kadarki en iyi mesafeden daha yakın olan her düşmanı tut.

local best, bestDistance = nil, range
for _, enemy in enemies:GetChildren() do
	-- Şu ana kadarki en iyisinden daha mı yakın? Onu tut
end
return best

CFrame.lookAt(from, at), from konumunda duran ve at konumuna bakan bir CFrame'dir; böylece başı hareket ettirmeden döndürür:

tower.Head.CFrame = CFrame.lookAt(tower.Head.Position, target.HumanoidRootPart.Position)

Sonsuza kadar çalışan bir döngü her turda beklemelidir, yoksa oyunu dondurur: hedef bulup bulmadığına bakılmaksızın 0.1 saniye bekle.

challenge icon

Görev

Orta
  1. nearestEnemy(position, range) işlevini yaz: yaşayan (bir HumanoidRootPart bileşeni ve Health > 0 değeri olan) ve position konumuna en yakın, range sınırları içindeki düşmanı veya nil değerini döndürsün.
  2. runTower(tower) işlevini yaz: kule oyundayken, kafasının Settings.Towers[tower.Name].Range menzili içindeki en yakın düşmanı bul, kafayı ona çevirecek şekilde döndür ve task.wait(0.1) çağır.
  3. placeTower işlevinin sonunda task.spawn(runTower, tower) ile başlat.

Play'e bas, başlangıcın yanına bir Archer inşa et ve hedefi takip edişini izle. Ardından Check'e bas.

Kendin dene

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

local remotes = game.ReplicatedStorage.Remotes
local enemies = workspace.Enemies
local towers = workspace.Towers

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

-- Yol noktaları, sırasıyla (1, 2, 3... olarak adlandırılmışlar)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- Üssün sağlığı, workspace'in bir niteliği olarak: her istemci bunu okuyabilir
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Her oyuncu liderlik tablosunda Money alır
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)

-- Bir düşman üsse ulaştı
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
end

-- Bir düşmanı yol boyunca ilerlet. MoveTo 8 saniye sonra vazgeçer ve bunu bildirir
-- (MoveToFinished, false ile), bu yüzden yavaş bir düşman varana kadar yeniden gönderilir.
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
	-- üsse ulaştı
	damageBase(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- Kapıda, yol boyunca ilerleyen yeni bir düşman
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- ilk yol noktasının hemen üstüne yerleştirildi
	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

-- Bir platforma kule inşa et
local function placeTower(pad, kind)
	local tower = ServerStorage.Towers[kind]:Clone()
	tower:PivotTo(pad.CFrame + Vector3.new(0, pad.Size.Y / 2 + 1, 0))
	tower.Parent = towers
end

-- İstemci, bir platforma kule yerleştirilmesini ister
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
	placeTower(pad, kind)
end)

-- Bir dalga: düşmanları teker teker gelir, ardından hepsi yok olana kadar beklenir
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

-- Dalgalar, her biri bir aradan sonra
for i, list in Settings.Waves do
	task.wait(Settings.WaveBreak)
	runWave(list)
end
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Roblox Oyunu: Kule Savunması bölümündeki tüm dersler