Menu
CoddyTech

Добраться до базы

Урок 3 из 18 курса Игра в Roblox: башенная защита на Coddy.

Враг, добравшийся до конца пути, наносит урон базе. Здоровье базы должно храниться на сервере, но оно будет отображаться на экране каждого игрока, поэтому храните его как атрибут рабочей области: атрибут, установленный на сервере, виден каждому клиенту.

workspace:SetAttribute("BaseHealth", Settings.BaseHealth)
print(workspace:GetAttribute("BaseHealth")) --> 20

damageBase(amount) уменьшает его, но не ниже 0 (math.max). После последной контрольной точки враг вызывает эту функцию и покидает игру с помощью Destroy.

challenge icon

Задание

Легко
  1. После сортировки путевых точек установи атрибут workspace BaseHealth равным Settings.BaseHealth.
  2. Напиши damageBase(amount), которая уменьшает BaseHealth на amount, но не ниже 0.
  3. В конце walkPath, после последней путевой точки, вызови damageBase(1) и уничтожь врага.

Нажми Play, затем Check.

Попробуйте сами

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")

-- Промежуточные точки пути по порядку (они названы 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- Каждый игрок получает Money в таблице лидеров
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)

-- Провести врага по пути. MoveTo прекращает попытку через 8 секунд и сообщает об этом
-- (MoveToFinished со значением false), поэтому медленному врагу снова задаётся цель, пока он не доберётся.
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
end

-- Новый враг у ворот, идущий по пути
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- появляется прямо над первой точкой пути
	enemy:PivotTo(waypoints[1].CFrame + Vector3.new(0, 5, 0))
	enemy.Parent = enemies
	task.spawn(walkPath, enemy)
	return enemy
end

-- Пока что один враг
spawnEnemy("Zombie")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Игра в Roblox: башенная защита