ПОЛЕЗНЫЕ СКРИПТЫ В ROBLOX STUDIO
Скрипты - одна из самых интересных частей 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;
- увеличить длительность ускорения;
- изменить силу прыжковой платформы;
- создать несколько чекпоинтов;
- заставить дверь открываться медленнее;
- изменить скорость спринта.
Так постепенно становится понятно не только то, как скопировать готовый скрипт, но и то, почему он работает.
И именно после этого писать собственные скрипты становится намного проще.
