← Все уроки
Урок 5

Создай свою первую игру «укради и защити»

У каждого игрока есть база. Схвати gem из центра, отнеси его домой, чтобы получить очко, и ударь любого, кто его несёт.

Бесплатно70 минут · Для новичков, последний урок · Roblox Studio
1
Шаг 1 / 8

Подготовь место

  1. Открой Roblox Studio, нажми New Experience и выбери шаблон Baseplate.
  2. Gem будет лежать в центре карты. Вокруг него встанут четыре базы, каждая примерно в 60 studs от центра.
  3. Для этой игры нужно минимум два игрока, поэтому в конце ты проверишь её с двумя тестовыми игроками.

Подробнее

  • Шаблон Baseplate есть в списке шаблонов на стартовом экране.
  • Поле Position в Properties показывает, где стоит деталь. Position 60, 0.5, 0 означает 60 studs от середины карты.
  • Перенеси SpawnLocation, платформу, на которой появляются игроки, ближе к середине, чтобы каждый игрок начинал на одинаковом расстоянии от самоцвета.
  • На Mac каждый раз, когда в уроке написано Ctrl, нажимай клавишу Cmd.
У меня не получается этот шаг

Сначала проверь эти три вещи

  • Название каждой детали и каждого скрипта точно такое же, как в уроке, с теми же заглавными буквами.
  • Скрипт лежит в нужном объекте. Посмотри на подпись над блоком с кодом.
  • Открой окно Output через меню Window. Красный текст показывает скрипт и строку, в которой есть проблема.

Всё ещё не получается? Напиши нам →

2
Шаг 2 / 8

Построй базы

  1. В Explorer наведи курсор на Workspace, нажми + и добавь Folder. Назови её Bases.
  2. Добавь Part. Задай Size равным 16, 1, 16, включи Anchored и сделай его серым. Перетащи его в Bases и назови Base1.
  3. Сделай три копии через Ctrl+D. Назови их Base2, Base3 и Base4 и поставь по одной с каждой стороны карты.

Подробнее

  • Чтобы положить деталь в папку, потяни её название в Explorer на название Bases.
  • Копии, сделанные через Ctrl+D, уже лежат в папке Bases. Переименуй каждую через F2.
  • Названия должны быть точно Base1, Base2, Base3 и Base4, без пробела перед числом.
  • На сервере, где больше четырёх игроков, игроков больше, чем баз. Позже ты можешь поставить размер сервера 4 в настройках игры на Creator Hub.
Совет. Держи все четыре базы на одинаковом расстоянии от центра. Тогда игра честная для всех.
У меня не получается этот шаг

Сначала проверь эти три вещи

  • Название каждой детали и каждого скрипта точно такое же, как в уроке, с теми же заглавными буквами.
  • Скрипт лежит в нужном объекте. Посмотри на подпись над блоком с кодом.
  • Открой окно Output через меню Window. Красный текст показывает скрипт и строку, в которой есть проблема.

Всё ещё не получается? Напиши нам →

3
Шаг 3 / 8

Создай gem

  1. Добавь Part в центре карты, примерно на 4 studs над полом. Задай Size равным 2, 2, 2, выбери яркий цвет и задай Material равным Neon. Назови его Gem.
  2. Включи Anchored и Massless, а CanCollide выключи.
  3. Наведи курсор на Gem, нажми + и добавь ProximityPrompt. Задай ActionText равным Take, а HoldDuration равным 1.

Что делает каждая часть

  • ProximityPrompt показывает кнопку, когда игрок стоит рядом. Если держать её 1 секунду, она срабатывает.
  • Включённый Massless и выключенный CanCollide не дают gem замедлять игрока, который его несёт, и толкать его.

Подробнее

  • Anchored, Massless и CanCollide являются флажками в Properties.
  • Когда ты щёлкаешь +, введи ProximityPrompt, чтобы его найти. Щёлкни его, а потом в Properties измени ActionText и HoldDuration.
  • В игре, когда ты стоишь рядом с самоцветом, появляется маленькая кнопка с буквой E и словом Take.
  • На телефоне игроки удерживают палец на этой кнопке.
У меня не получается этот шаг

Сначала проверь эти три вещи

  • Название каждой детали и каждого скрипта точно такое же, как в уроке, с теми же заглавными буквами.
  • Скрипт лежит в нужном объекте. Посмотри на подпись над блоком с кодом.
  • Открой окно Output через меню Window. Красный текст показывает скрипт и строку, в которой есть проблема.

Всё ещё не получается? Напиши нам →

4
Шаг 4 / 8

Дай каждому игроку базу и счёт

  1. Наведи курсор на ServerScriptService, нажми + и добавь Script. Назови его Game.
  2. Удали строку, которая там уже есть, и вставь этот код. Это первая из трёх частей.
  3. Нажми Play. Одна база станет зелёной. Это твоя.
ServerScriptService > Game (1 / 3)
local Players = game:GetService("Players")

local bases = workspace:WaitForChild("Bases")
local gem = workspace:WaitForChild("Gem")
local home = gem.CFrame
local carrier = nil

Players.PlayerAdded:Connect(function(player)
	local stats = Instance.new("Folder")
	stats.Name = "leaderstats"
	stats.Parent = player

	local score = Instance.new("IntValue")
	score.Name = "Score"
	score.Parent = stats

	for _, base in ipairs(bases:GetChildren()) do
		if base:GetAttribute("Owner") == nil then
			base:SetAttribute("Owner", player.UserId)
			base.Color = Color3.fromRGB(60, 220, 120)
			break
		end
	end
end)

Players.PlayerRemoving:Connect(function(player)
	for _, base in ipairs(bases:GetChildren()) do
		if base:GetAttribute("Owner") == player.UserId then
			base:SetAttribute("Owner", nil)
			base.Color = Color3.fromRGB(160, 160, 160)
		end
	end
end)

Что делает каждая часть

  • Первые строки находят базы и gem и запоминают, где gem лежал сначала.
  • SetAttribute записывает UserId владельца на первую свободную базу.
  • PlayerRemoving освобождает базу снова, когда её владелец уходит.

Подробнее

  • Скрипт открывается в новой вкладке. Щёлкни внутри кода, нажми Ctrl+A, а потом Ctrl+V, чтобы заменить всё.
  • Какая база станет зелёной, зависит от порядка баз в папке. Пройдись по миру, чтобы найти свою.
  • Список игроков в правом верхнем углу показывает Score 0.
  • Пока ничего не происходит, когда ты подходишь к самоцвету и удерживаешь E. Это будет на следующем шаге.
У меня не получается этот шаг

Сначала проверь эти три вещи

  • Название каждой детали и каждого скрипта точно такое же, как в уроке, с теми же заглавными буквами.
  • Скрипт лежит в нужном объекте. Посмотри на подпись над блоком с кодом.
  • Открой окно Output через меню Window. Красный текст показывает скрипт и строку, в которой есть проблема.

Всё ещё не получается? Напиши нам →

5
Шаг 5 / 8

Позволь игрокам брать gem

  1. Снова открой скрипт Game.
  2. Вставь этот код ниже кода из прошлого шага.
  3. Нажми Play, подойди к gem и держи E. Gem подпрыгнет над твоей головой и будет следовать за тобой.
ServerScriptService > Game (2 / 3)
local function resetGem()
	carrier = nil

	local weld = gem:FindFirstChild("CarryWeld")
	if weld then
		weld:Destroy()
	end

	gem.Anchored = true
	gem.CFrame = home
	gem.ProximityPrompt.Enabled = true
end

gem.ProximityPrompt.Triggered:Connect(function(player)
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if carrier or not root then return end

	carrier = player
	gem.ProximityPrompt.Enabled = false
	gem.Anchored = false
	gem.CFrame = root.CFrame * CFrame.new(0, 4, 0)

	local weld = Instance.new("WeldConstraint")
	weld.Name = "CarryWeld"
	weld.Part0 = root
	weld.Part1 = gem
	weld.Parent = gem
end)

Что делает каждая часть

  • carrier помнит, кто держит gem. Пока он у кого-то, больше никто не может его взять.
  • WeldConstraint приклеивает gem к игроку, поэтому он двигается вместе с ним.
  • resetGem убирает приклейку и возвращает gem в центр.

Подробнее

  • Чтобы снова открыть скрипт, дважды щёлкни Game в Explorer.
  • Щёлкни после самого последнего символа кода и дважды нажми Enter. Потом нажми Ctrl+V. В этот раз не нажимай Ctrl+A, иначе заменишь первую часть.
  • Пока ты несёшь самоцвет, он парит на 4 studs над твоей головой.
  • Чтобы проверить: возьми самоцвет и убедись, что кнопка Take пропала на всё время, пока ты его несёшь.
У меня не получается этот шаг

Сначала проверь эти три вещи

  • Название каждой детали и каждого скрипта точно такое же, как в уроке, с теми же заглавными буквами.
  • Скрипт лежит в нужном объекте. Посмотри на подпись над блоком с кодом.
  • Открой окно Output через меню Window. Красный текст показывает скрипт и строку, в которой есть проблема.

Всё ещё не получается? Напиши нам →

6
Шаг 6 / 8

Добавь очки и удары

  1. Вставь эту последнюю часть в самый конец скрипта Game.
  2. Нажми Play, возьми gem и забеги на свою зелёную базу. Score вырастет на 1, а gem вернётся в центр.
ServerScriptService > Game (3 / 3)
for _, base in ipairs(bases:GetChildren()) do
	base.Touched:Connect(function(hit)
		local player = Players:GetPlayerFromCharacter(hit.Parent)
		if player and player == carrier and base:GetAttribute("Owner") == player.UserId then
			player.leaderstats.Score.Value += 1
			resetGem()
		end
	end)
end

while true do
	task.wait(0.2)

	if carrier then
		local weld = gem:FindFirstChild("CarryWeld")
		local root = weld and weld.Part0
		local character = root and root.Parent
		local humanoid = character and character:FindFirstChildOfClass("Humanoid")

		if not humanoid or humanoid.Health <= 0 or root.Position.Y < -20 then
			resetGem()
		else
			for _, other in ipairs(Players:GetPlayers()) do
				local otherRoot = other ~= carrier and other.Character and other.Character:FindFirstChild("HumanoidRootPart")
				if otherRoot and (otherRoot.Position - root.Position).Magnitude < 5 then
					resetGem()
					break
				end
			end
		end
	end
end

Что делает каждая часть

  • Каждая база проверяет три вещи: игрок коснулся её, этот игрок несёт gem, и база принадлежит ему.
  • Цикл внизу работает 5 раз в секунду. Если другой игрок подходит к тому, кто несёт gem, ближе чем на 5 studs, gem возвращается.
  • Цикл также возвращает gem, если тот, кто его нёс, вышел из игры или упал с карты.

Подробнее

  • Снова щёлкни после самого последнего символа скрипта, дважды нажми Enter и вставь код.
  • Готовый скрипт состоит из трёх частей в таком порядке: базы и счёт, взятие самоцвета, очки и удар.
  • Серая база, которая никому не принадлежит, очков не даёт. Считается только твоя собственная зелёная база.
  • В одиночку удар не проверить. Это ты сделаешь вдвоём на следующем шаге.
Частая ошибка. Вставить эту часть в середину скрипта. Цикл while никогда не заканчивается, поэтому код ниже него не запускается.
У меня не получается этот шаг

Сначала проверь эти три вещи

  • Название каждой детали и каждого скрипта точно такое же, как в уроке, с теми же заглавными буквами.
  • Скрипт лежит в нужном объекте. Посмотри на подпись над блоком с кодом.
  • Открой окно Output через меню Window. Красный текст показывает скрипт и строку, в которой есть проблема.

Всё ещё не получается? Напиши нам →

7
Шаг 7 / 8

Проверь с двумя игроками

  1. Рядом с кнопкой Play открой маленькое меню и выбери Server & Clients. Поставь число игроков 2 и нажми Play.
  2. Studio откроет два окна игры. В каждом свой игрок и своя база.
  3. В одном окне возьми gem. В другом окне набеги на этого игрока. Gem вернётся в центр.
  4. Останови тест красной кнопкой Stop в главном окне Studio, потом переключи меню обратно на Test.

Подробнее

  • Маленькое меню является стрелкой сразу справа от кнопки Play вверху Studio.
  • Два окна игры открываются одно поверх другого. Отодвинь одно в сторону, чтобы видеть оба.
  • Щёлкни внутри окна, прежде чем пользоваться клавиатурой. Клавиши идут в то окно, которое ты щёлкнул последним.
  • Для проверки с двумя окнами нужен компьютер с достаточным объёмом памяти. Если всё очень медленно, сначала закрой другие программы.
У меня не получается этот шаг

Сначала проверь эти три вещи

  • Название каждой детали и каждого скрипта точно такое же, как в уроке, с теми же заглавными буквами.
  • Скрипт лежит в нужном объекте. Посмотри на подпись над блоком с кодом.
  • Открой окно 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. Красный текст показывает скрипт и строку, в которой есть проблема.

Всё ещё не получается? Напиши нам →

Теперь измени сам

  • Закончи раунд, когда игрок набирает 5 очков, и обнули все Score.
  • Добавь второй gem другого цвета.
  • Сделай так, чтобы тот, кто несёт gem, бежал медленнее. Подсказка: поставь Humanoid.WalkSpeed равным 12, когда gem взят, и обратно 16 в resetGem.