ПОЛЕЗНЫЕ СКРИПТЫ В ROBLOX STUDIO

Полезные скрипты в Roblox Studio: 10 годных примеров для своей игры
Полезные скрипты в Roblox Studio: 10 годных примеров для своей игры

Скрипты - одна из самых интересных частей Roblox Studio. Именно с их помощью обычная карта превращается в настоящую игру.

Без скриптов блок просто стоит на месте. А со скриптом он может выдавать монеты, открывать дверь, телепортировать игрока, сохранять прогресс или превращаться в опасную лаву.

В Roblox Studio используется язык Luau. Он довольно простой для начала, особенно если изучать его не по огромным сложным программам, а по небольшим готовым примерам.

Ниже собрано 10 реально полезных скриптов, которые можно использовать в своих играх.

1. Счётчик монет

Начнём с базы. Сделаем игроку параметр Coins, в котором будет храниться количество его монет.

Создайте:

ServerScriptService -> Script

И вставьте:

local Players = game:GetService("Players")

local function setupPlayer(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local coins = Instance.new("IntValue")
	coins.Name = "Coins"
	coins.Value = 0
	coins.Parent = leaderstats
end

Players.PlayerAdded:Connect(setupPlayer)

После входа игрока появится счётчик Coins.

Папку важно назвать именно:

leaderstats

Roblox распознаёт это название и может автоматически показывать находящиеся внутри значения в таблице игроков.

Вместо Coins можно создать:

Wins
Level
Points
Kills
Gems

То есть этот маленький скрипт можно использовать почти в любой игре.

2. Монетка, которую можно подобрать

Теперь сделаем так, чтобы игрок мог собирать настоящие монеты.

Создайте Part, который будет монеткой.

Внутрь него добавьте:

Script

Код:

local Players = game:GetService("Players")

local coin = script.Parent
local collected = false

coin.CanCollide = false

coin.Touched:Connect(function(hit)
	if collected then
		return
	end

	local character = hit:FindFirstAncestorOfClass("Model")

	if not character then
		return
	end

	local humanoid = character:FindFirstChildOfClass("Humanoid")

	if not humanoid then
		return
	end

	local player = Players:GetPlayerFromCharacter(character)

	if not player then
		return
	end

	local leaderstats = player:FindFirstChild("leaderstats")
	local coins = leaderstats and leaderstats:FindFirstChild("Coins")

	if not coins then
		return
	end

	collected = true

	coins.Value += 1

	coin.Transparency = 1
	coin.CanTouch = false

	task.wait(5)

	coin.Transparency = 0
	coin.CanTouch = true
	collected = false
end)

Теперь при касании монетки игрок получит:

+1 Coins

После этого монетка исчезнет на 5 секунд и появится снова.

Хотите выдавать сразу 10 монет?

Найдите:

coins.Value += 1

И замените на:

coins.Value += 10

Очень удобная основа для Simulator, Obby, Tycoon и других игр.

3. Смертельный блок или лава

Классика для Obby.

Создайте красный Part, а внутрь добавьте обычный Script.

local lava = script.Parent

lava.Touched:Connect(function(hit)
	local character = hit:FindFirstAncestorOfClass("Model")

	if not character then
		return
	end

	local humanoid = character:FindFirstChildOfClass("Humanoid")

	if humanoid then
		humanoid.Health = 0
	end
end)

Теперь персонаж погибнет после касания блока.

Такой скрипт можно использовать для:

  • лавы;
  • лазеров;
  • шипов;
  • ядовитой воды;
  • пропасти;
  • опасных стен.

Сам Part можно сделать ярко-красным, добавить материал Neon и получить вполне неплохую лаву.

4. Ускоряющая площадка

Хотите сделать платформу, после которой игрок несколько секунд бегает намного быстрее?

Создайте Part и добавьте внутрь Script.

local pad = script.Parent
local activePlayers = {}

pad.Touched:Connect(function(hit)
	local character = hit:FindFirstAncestorOfClass("Model")

	if not character then
		return
	end

	local humanoid = character:FindFirstChildOfClass("Humanoid")

	if not humanoid then
		return
	end

	if activePlayers[humanoid] then
		return
	end

	activePlayers[humanoid] = true

	local oldSpeed = humanoid.WalkSpeed

	humanoid.WalkSpeed = 32

	task.wait(5)

	if humanoid.Parent then
		humanoid.WalkSpeed = oldSpeed
	end

	activePlayers[humanoid] = nil
end)

Игрок коснулся платформы - получил ускорение.

Через 5 секунд скорость вернётся обратно.

Скорость можно изменить здесь:

humanoid.WalkSpeed = 32

Например:

humanoid.WalkSpeed = 50

А длительность бонуса меняется здесь:

task.wait(5)

5. Прыжковая площадка

Теперь сделаем платформу, которая подбрасывает персонажа вверх.

Создайте Part и положите внутрь него Script.

local jumpPad = script.Parent
local cooldown = {}

jumpPad.Touched:Connect(function(hit)
	local character = hit:FindFirstAncestorOfClass("Model")

	if not character or cooldown[character] then
		return
	end

	local humanoid = character:FindFirstChildOfClass("Humanoid")
	local rootPart = character:FindFirstChild("HumanoidRootPart")

	if not humanoid or not rootPart then
		return
	end

	cooldown[character] = true

	local velocity = rootPart.AssemblyLinearVelocity

	rootPart.AssemblyLinearVelocity = Vector3.new(
		velocity.X,
		80,
		velocity.Z
	)

	task.wait(1)

	cooldown[character] = nil
end)

При касании игрока подбросит вверх.

Сила находится здесь:

80

Например:

120

подбросит значительно выше.

Так можно делать батуты, пушки, трамплины и необычные участки Obby.

6. Телепорт между двумя точками

Очень полезная штука для порталов, дверей и переходов между комнатами.

Создайте два Part:

TeleportA
TeleportB

Внутрь TeleportA добавьте Script.

local teleporter = script.Parent
local target = workspace:WaitForChild("TeleportB")

local cooldown = {}

teleporter.Touched:Connect(function(hit)
	local character = hit:FindFirstAncestorOfClass("Model")

	if not character or cooldown[character] then
		return
	end

	local humanoid = character:FindFirstChildOfClass("Humanoid")

	if not humanoid then
		return
	end

	cooldown[character] = true

	character:PivotTo(
		target.CFrame * CFrame.new(0, 4, 0)
	)

	task.wait(1)

	cooldown[character] = nil
end)

Теперь игрок касается TeleportA и оказывается около TeleportB.

Зачем это использовать?

  • портал в другую комнату;
  • секретный проход;
  • переход между этажами;
  • телепорт на арену;
  • возвращение в главное лобби.

Важно: этот пример перемещает игрока внутри текущей карты, а не в другую Roblox-игру.

7. Чекпоинт

Если вы делаете Obby, чекпоинты практически обязательны.

Создайте объект:

SpawnLocation

Поставьте его в нужном месте карты.

Внутрь SpawnLocation добавьте Script:

local Players = game:GetService("Players")

local checkpoint = script.Parent

checkpoint.Touched:Connect(function(hit)
	local character = hit:FindFirstAncestorOfClass("Model")

	if not character then
		return
	end

	local humanoid = character:FindFirstChildOfClass("Humanoid")

	if not humanoid or humanoid.Health <= 0 then
		return
	end

	local player = Players:GetPlayerFromCharacter(character)

	if not player then
		return
	end

	player.RespawnLocation = checkpoint
end)

Готово.

Когда игрок коснётся этого SpawnLocation, он станет его новой точкой возрождения.

Если игрок после этого упадёт в лаву или погибнет, он появится на последнем достигнутом чекпоинте.

Для длинных Obby это одна из самых полезных механик.

8. Открывающаяся дверь

А теперь что-нибудь поинтереснее.

Создайте Part, который будет дверью.

У двери включите:

Anchored = true

Внутрь двери добавьте:

ProximityPrompt
Script

В Script вставьте:

local TweenService = game:GetService("TweenService")

local door = script.Parent
local prompt = door:WaitForChild("ProximityPrompt")

local closedPosition = door.CFrame
local openPosition = door.CFrame * CFrame.new(0, door.Size.Y + 1, 0)

local opened = false
local busy = false

prompt.Triggered:Connect(function()
	if busy then
		return
	end

	busy = true
	prompt.Enabled = false

	local targetPosition

	if opened then
		targetPosition = closedPosition
	else
		targetPosition = openPosition
	end

	local tween = TweenService:Create(
		door,
		TweenInfo.new(
			0.6,
			Enum.EasingStyle.Quad,
			Enum.EasingDirection.Out
		),
		{
			CFrame = targetPosition
		}
	)

	tween:Play()
	tween.Completed:Wait()

	opened = not opened
	busy = false
	prompt.Enabled = true
end)

Теперь возле двери появится подсказка взаимодействия.

Игрок сможет открыть дверь, а при повторном использовании закрыть её.

TweenService нужен для плавного движения. Без него дверь просто мгновенно прыгнула бы из одной точки в другую.

Такую систему можно использовать не только для дверей, но и для:

  • лифтов;
  • ворот;
  • мостов;
  • секретных стен;
  • платформ.

9. Бег на Shift

Сделаем нормальный спринт.

Этот скрипт уже нужно создавать не в ServerScriptService.

Откройте:

StarterPlayer -> StarterPlayerScripts

Добавьте:

LocalScript

Код:

local Players = game:GetService("Players")
local ContextActionService = game:GetService("ContextActionService")

local player = Players.LocalPlayer

local WALK_SPEED = 16
local RUN_SPEED = 28

local function setSpeed(speed)
	local character = player.Character

	if not character then
		return
	end

	local humanoid = character:FindFirstChildOfClass("Humanoid")

	if humanoid then
		humanoid.WalkSpeed = speed
	end
end

local function sprintAction(actionName, inputState)
	if inputState == Enum.UserInputState.Begin then
		setSpeed(RUN_SPEED)
	elseif inputState == Enum.UserInputState.End
		or inputState == Enum.UserInputState.Cancel then

		setSpeed(WALK_SPEED)
	end

	return Enum.ContextActionResult.Sink
end

ContextActionService:BindAction(
	"Sprint",
	sprintAction,
	true,
	Enum.KeyCode.LeftShift
)

ContextActionService:SetTitle("Sprint", "Бег")

Теперь на компьютере можно удерживать левый Shift и бежать быстрее.

Особенно удобно то, что ContextActionService умеет создавать кнопку действия и для сенсорных устройств.

Обычная скорость:

local WALK_SPEED = 16

Скорость бега:

local RUN_SPEED = 28

Можно поставить свои значения.

10. Сохранение монет

А вот это уже очень полезная вещь для настоящей игры.

Сейчас наши Coins исчезнут, когда игрок выйдет с сервера.

Исправим это с помощью DataStoreService.

Этот пример рассчитан на то, что вы уже добавили скрипт номер 1 со счётчиком Coins.

Создайте новый:

ServerScriptService -> Script

И вставьте:

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")

local coinsStore = DataStoreService:GetDataStore("PlayerCoins")

local function getKey(player)
	return "Player_" .. player.UserId
end

local function loadPlayer(player)
	local leaderstats = player:WaitForChild("leaderstats")
	local coins = leaderstats:WaitForChild("Coins")

	local success, savedCoins = pcall(function()
		return coinsStore:GetAsync(getKey(player))
	end)

	if success then
		if typeof(savedCoins) == "number" then
			coins.Value = savedCoins
		end
	else
		warn("Не удалось загрузить монеты игрока " .. player.Name)
	end
end

local function savePlayer(player)
	local leaderstats = player:FindFirstChild("leaderstats")

	if not leaderstats then
		return
	end

	local coins = leaderstats:FindFirstChild("Coins")

	if not coins then
		return
	end

	local success, errorMessage = pcall(function()
		coinsStore:UpdateAsync(getKey(player), function()
			return coins.Value
		end)
	end)

	if not success then
		warn("Не удалось сохранить данные: " .. tostring(errorMessage))
	end
end

Players.PlayerAdded:Connect(loadPlayer)
Players.PlayerRemoving:Connect(savePlayer)

game:BindToClose(function()
	for _, player in Players:GetPlayers() do
		savePlayer(player)
	end
end)

Теперь игра пытается загрузить количество монет при входе игрока и сохранить его при выходе.

Почему здесь используется:

pcall()

Потому что работа с сохранениями связана с серверами Roblox, и запрос иногда может завершиться ошибкой. Благодаря pcall() весь скрипт не сломается из-за одного неудачного запроса.

Для проверки DataStore через Roblox Studio игру сначала нужно опубликовать, а доступ Studio к API включается в настройках безопасности игры.

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

Что изучать дальше?

Если вы разобрались хотя бы с частью этих примеров, то уже познакомились с очень важными вещами в Luau:

local
if
function
return
task.wait()
:GetService()
:FindFirstChild()
:WaitForChild()

А ещё увидели несколько основных событий:

PlayerAdded
PlayerRemoving
Touched
Triggered

Необязательно пытаться сразу запомнить весь код.

Гораздо полезнее брать простой скрипт и менять его.

Например, попробуйте:

  • сделать монетку стоимостью 5 Coins;
  • увеличить длительность ускорения;
  • изменить силу прыжковой платформы;
  • создать несколько чекпоинтов;
  • заставить дверь открываться медленнее;
  • изменить скорость спринта.

Так постепенно становится понятно не только то, как скопировать готовый скрипт, но и то, почему он работает.

И именно после этого писать собственные скрипты становится намного проще.

328 views·3 shares