← Усі уроки
Урок 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.
Цей крок у мене не виходить

Спершу перевір ці три речі

  • Назва кожної частини й кожного скрипта точно така, як в уроці, з тими самими великими літерами.
  • Скрипт лежить у правильному об'єкті. Подивись на підпис над блоком із кодом.
  • Відкрий вікно Output через меню Window. Червоний текст показує скрипт і рядок, у якому є проблема.

Усе ще не виходить? Напиши нам →

2
Крок 2 / 8

Збудуй шлях

  1. Додай Part. Постав Size на 6, 1, 6, увімкни Anchored і перетягни її в папку Path. Назви її 1.
  2. Скопіюй її через Ctrl+D і посунь копію приблизно на 30 studs. Назви її 2.
  3. Повторюй, поки не матимеш 5 частин із назвами 1, 2, 3, 4 і 5. Розстав їх так, щоб у маршруті було кілька поворотів.
  4. Вороги йтимуть від 1 до 2, до 3 і так далі, по прямій лінії між кожною парою.

Докладніше

  • Щоб покласти частину в теку, потягни її назву в Explorer на назву Path.
  • Копія, зроблена через Ctrl+D, уже лежить у теці Path. Тобі лишається тільки пересунути її й перейменувати.
  • Назви є просто числами: 1, 2, 3, 4, 5. Без літер і без пробілів.
  • Лиши частини лежати на підлозі. Вороги ширяють на 2 studs над ними.
Часта помилка. Пропустити число. Якщо частини 3 немає, вороги зупиняються на частині 2, а скрипт показує помилку.
Цей крок у мене не виходить

Спершу перевір ці три речі

  • Назва кожної частини й кожного скрипта точно така, як в уроці, з тими самими великими літерами.
  • Скрипт лежить у правильному об'єкті. Подивись на підпис над блоком із кодом.
  • Відкрий вікно Output через меню Window. Червоний текст показує скрипт і рядок, у якому є проблема.

Усе ще не виходить? Напиши нам →

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 ігнорують гравітацію й поштовхи.
Цей крок у мене не виходить

Спершу перевір ці три речі

  • Назва кожної частини й кожного скрипта точно така, як в уроці, з тими самими великими літерами.
  • Скрипт лежить у правильному об'єкті. Подивись на підпис над блоком із кодом.
  • Відкрий вікно Output через меню Window. Червоний текст показує скрипт і рядок, у якому є проблема.

Усе ще не виходить? Напиши нам →

4
Крок 4 / 8

Збудуй базу

  1. Додай велику Part у кінці шляху, поруч із частиною 5. Увімкни 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. Додай Script до Base і встав цей код.
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.
Цей крок у мене не виходить

Спершу перевір ці три речі

  • Назва кожної частини й кожного скрипта точно така, як в уроці, з тими самими великими літерами.
  • Скрипт лежить у правильному об'єкті. Подивись на підпис над блоком із кодом.
  • Відкрий вікно Output через меню Window. Червоний текст показує скрипт і рядок, у якому є проблема.

Усе ще не виходить? Напиши нам →

5
Крок 5 / 8

Відправ хвилі

  1. Наведи курсор на ServerScriptService, натисни + і додай Script. Назви його Waves.
  2. Видали рядок, який уже є, і встав цей код.
  3. Натисни Play. Кожні 3 секунди біля частини 1 з'являється червона куля й рухається шляхом. Коли вона доходить до кінця, база втрачає 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 робить копію шаблону Enemy із ServerStorage.
  • Функція walk переміщує ворога до кожної частини шляху по черзі. distance / SPEED тримає швидкість однаковою на довгих і коротких відрізках.
  • task.spawn дозволяє кожному ворогові йти самому по собі, тож цикл може й далі відправляти нових.

Докладніше

  • Скрипт відкривається в новій вкладці. Клацни всередині коду, натисни Ctrl+A, а потім Ctrl+V, щоб замінити все.
  • Поки гра працює, вороги з'являються в теці Enemies. Ти можеш стежити за ними в Explorer.
  • Поки вежі немає, кожен ворог доходить до бази. Після 10 ворогів напис показує Game over, і нові вороги більше не приходять.
  • Червоний текст про відсутню назву в Output означає, що частина шляху або тека має неправильну назву.
Цей крок у мене не виходить

Спершу перевір ці три речі

  • Назва кожної частини й кожного скрипта точно така, як в уроці, з тими самими великими літерами.
  • Скрипт лежить у правильному об'єкті. Подивись на підпис над блоком із кодом.
  • Відкрий вікно Output через меню Window. Червоний текст показує скрипт і рядок, у якому є проблема.

Усе ще не виходить? Напиши нам →

6
Крок 6 / 8

Збудуй вежу

  1. Додай Part біля повороту шляху. Постав Size на 4, 8, 4, увімкни Anchored і назви її Tower.
  2. Додай Script до Tower і встав цей код.
  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, а потім пересунь копію. Скрипт іде разом із нею.
Порада. Вежа працює найкраще біля повороту, бо там вороги довше лишаються в радіусі дії.
Цей крок у мене не виходить

Спершу перевір ці три речі

  • Назва кожної частини й кожного скрипта точно така, як в уроці, з тими самими великими літерами.
  • Скрипт лежить у правильному об'єкті. Подивись на підпис над блоком із кодом.
  • Відкрий вікно Output через меню Window. Червоний текст показує скрипт і рядок, у якому є проблема.

Усе ще не виходить? Напиши нам →

7
Крок 7 / 8

Протестуй і збалансуй

  1. Натисни F5 і подивись кілька хвиль.
  2. Якщо жоден ворог ніколи не доходить до бази, гра надто легка. Якщо база швидко втрачає все здоров'я, вона надто складна.
  3. Збалансуй гру трьома числами: часом очікування в Waves, значенням Health ворога і DAMAGE вежі.
  4. Натисни Shift+F5, щоб зупинити. Якщо щось не працює, відкрий вікно Output у меню Window і прочитай червоний текст.

Докладніше

  • Змінюй лише одне число за раз, а потім грай знову. Інакше ти не знатимеш, яка зміна допомогла.
  • Час очікування є числом у task.wait(3) ближче до кінця скрипта Waves. Менше число посилає ворогів швидше.
  • Health ворога лежить у ServerStorage, усередині Enemy. DAMAGE вежі стоїть угорі скрипта Tower.
  • Хороша перша мета: база має протриматися дві хвилини з двома вежами.
Цей крок у мене не виходить

Спершу перевір ці три речі

  • Назва кожної частини й кожного скрипта точно така, як в уроці, з тими самими великими літерами.
  • Скрипт лежить у правильному об'єкті. Подивись на підпис над блоком із кодом.
  • Відкрий вікно Output через меню Window. Червоний текст показує скрипт і рядок, у якому є проблема.

Усе ще не виходить? Напиши нам →

8
Крок 8 / 8

Опублікуй гру

  1. Вибери File → Publish to Roblox. Дай грі назву й короткий опис.
  2. На сайті Creator Hub відкрий свою гру й заповни анкету Maturity.
  3. Постав гру на Public і надішли посилання другові.

Докладніше

  • Коли ти публікуєш уперше, Studio просить назву й опис. Натисни Create.
  • Creator Hub є сайтом create.roblox.com. Увійди з тим самим акаунтом і клацни свою гру в списку.
  • Перш ніж гру можна зробити публічною, Roblox може попросити ще дещо, наприклад перевірку віку на акаунті. Сторінка підкаже, чого бракує.
  • Якщо тобі ще немає 18, виконуй цей крок разом із кимось із батьків.
Порада. Покажи гру другові й постав одне запитання: було надто легко чи надто складно? Потім зміни одне число й протестуй знову.
Цей крок у мене не виходить

Спершу перевір ці три речі

  • Назва кожної частини й кожного скрипта точно така, як в уроці, з тими самими великими літерами.
  • Скрипт лежить у правильному об'єкті. Подивись на підпис над блоком із кодом.
  • Відкрий вікно Output через меню Window. Червоний текст показує скрипт і рядок, у якому є проблема.

Усе ще не виходить? Напиши нам →

Тепер змін це сам

  • Додай другу вежу з малим радіусом дії та DAMAGE 2.
  • Зроби так, щоб хвилі з часом прискорювалися. Підказка: тримай час очікування в змінній і трохи зменшуй її після кожного ворога.
  • Дай базі 20 здоров'я й зроби так, щоб кожен ворог забирав 2.