Roblox / Luau — скрипты для новичков
Подборка готовых скриптов Roblox Studio на Luau с подробным разбором каждой строки — «что написано», «что происходит в Play» и «зачем так». Страница для тех, кто в Google ищет roblox script, luau script example, kill brick touched, leaderstats coins, LocalScript walkspeed, RemoteEvent FireServer или собирает первый obby, лабораторную и мини-игру.
Основы скриптов в Roblox Studio
Luau — язык Roblox (диалект Lua). Код живёт не в отдельном .lua на диске, а в объектах Script, LocalScript и ModuleScript в дереве Explorer. Нажали Play (F5) — Studio запускает локальный сервер и клиент; скрипты начинают выполняться.
Установка Studio и первый Place — Roblox Studio — первая игра. Синтаксис — основы Lua, API Roblox — Luau в Roblox. Рисование на Python — Turtle; те же идеи «событие → действие» — здесь, в 3D. Unity-аналог — скрипты C#.
Как запустить пример за 30 секунд
- Откройте Roblox Studio → шаблон Baseplate.
- В Explorer найдите папку из инструкции к примеру (чаще всего ServerScriptService).
- ПКМ → Insert Object → Script или LocalScript → переименуйте (
HelloServer,CoinPickup…). - Дважды щёлкните скрипт → вставьте код целиком → Ctrl+S.
- Test → Play (F5). Окно View → Output — белые
printи красные ошибки.
| Где смотреть результат | Что увидите |
|---|---|
| Output | Текст print, ошибки с номером строки |
| Viewport | Движение Part, смерть на лаве, исчезновение монетки |
| Tab (клавиша Tab в Play) | Таблица leaderstats с Coins |
| Экран игрока | UI из StarterGui |
Скрипты не запускаются на этой странице сайта — только в Studio или в опубликованной игре.
Что ищут в Google — быстрый переход
| Типичный запрос | Куда на странице |
|---|---|
roblox script example, luau script | Первый print, каркас |
roblox script template | Обязательный каркас |
ServerScriptService script | Каркас Script |
roblox print hello | Первый print |
Players.PlayerAdded | Приветствие игрока |
roblox rotate part | Вращение Part |
roblox lava script kill | Кирпич-смерть |
roblox collect coin script | Монетка и leaderstats |
leaderstats roblox | Монетка и leaderstats |
roblox jump pad script | Прыжковая платформа |
roblox sprint script LocalScript | Спринт |
WalkSpeed script roblox | Спринт |
roblox gui TextLabel score | UI счёт |
RemoteEvent FireServer example | RemoteEvent |
require ModuleScript roblox | ModuleScript |
roblox Touched not working | Частые ошибки |
LocalPlayer is nil | Частые ошибки |
how to make obby roblox | Мини-проект obby |
Базовые термины — за 2 минуты
| Термин | Простыми словами |
|---|---|
| Script | Код на сервере — счёт, урон, спавн, античит |
| LocalScript | Код на вашем ПК — UI, камера, ввод клавиш |
| ModuleScript | Библиотека функций; подключается через require |
| Part | Куб, шар, платформа на карте |
| Humanoid | «Жизнь» персонажа — здоровье, прыжок, скорость |
| Touched | Событие «что-то коснулось этого Part» |
| Connect | Подписка на событие — «когда случится X, вызови функцию» |
| leaderstats | Папка у Player; Roblox показывает её в Tab как таблицу счёта |
| RemoteEvent | Сигнал клиент → сервер (и обратно) по сети |
| CFrame | Позиция и поворот объекта в 3D |
Какую механику выбрать
| Вы ищете… | Пример ниже | Идея |
|---|---|---|
| Проверить, что Studio работает | Одна строка в Output | |
| Покрасить платформу | Цвет Part | Свойства объекта из кода |
| Лава / смерть | Кирпич-смерть | Touched → Health = 0 |
| Монетки, очки | Монетка | leaderstats + IntValue |
| Прыжок выше | Jump pad | Humanoid.JumpPower / JumpHeight |
| Бег по Shift | Спринт | LocalScript + WalkSpeed |
| Текст на экране | UI | TextLabel + Changed |
| Кнопка E → действие | RemoteEvent | Клиент просит, сервер решает |
| Общий код в одном месте | ModuleScript | require |
Клиент и сервер — где какой скрипт
В Roblox один сервер (главный по правилам игры) и клиент у каждого игрока (его экран и клавиатура). Счёт монет и урон от лавы делают на сервере. Подпись «Монеты: 5» на экране и реакция на Shift — часто на клиенте, но цифру монет всё равно меняет сервер.
| Тип | Папка в Explorer | Кто выполняет |
|---|---|---|
| Script | ServerScriptService, иногда внутри Part | Сервер |
| LocalScript | StarterPlayerScripts, StarterGui | Только этот игрок |
| ModuleScript | ReplicatedStorage, ServerScriptService | Откуда вызвали require |
| Turtle Python | Unity | Roblox Luau | |
|---|---|---|---|
| Запуск | python file.py | Кнопка Play | F5 в Studio |
| Мир | окно черепашки | Scene | Workspace + Explorer |
| Цикл кадров | ontimer / цикл | Update() | RunService.Heartbeat |
| Касание | нет | OnTriggerEnter | Touched |
В Script на сервере Players.LocalPlayer всегда nil. Свой персонаж на клиенте — LocalScript и Players.LocalPlayer. Очки, которые видят все игроки, создавайте в leaderstats на сервере.
Обязательный каркас
Любой учебный скрипт повторяет одну схему: получить сервис → подписаться на событие или цикл → менять объекты.
Script на сервере (ServerScriptService)
--!strict
local Players = game:GetService("Players")
print("Сервер запущен")
-- обработчики: PlayerAdded, Touched, task.wait, require
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
--!strict | Studio проверяет типы при наборе | Меньше ошибок «не тот тип» |
local Players = ... | Ссылка на сервис игроков | Не писать длинный путь каждый раз |
game:GetService("Players") | Официальный способ взять API | Работает после перезагрузки Place |
game | Корень всего дерева Explorer | Отсюда доступен весь мир |
print(...) | Строка в Output | Первая отладка без UI |
Разбор по смыслу:
- В Luau
local— переменная только в этом файле; так принято почти везде. - Комментарий
--— строка для человека, движок её пропускает. - Серверный скрипт не видит клавиатуру игрока — для WASD нужен LocalScript.
LocalScript на клиенте (StarterPlayerScripts)
--!strict
local Players = game:GetService("Players")
local player = Players.LocalPlayer
print("Клиент готов:", player.Name)
| Строка | Что происходит | Зачем |
|---|---|---|
LocalPlayer | Объект вашего игрока на этом ПК | UI, камера, «свой» ввод |
StarterPlayerScripts | При входе Studio копирует скрипт в игрока | Один раз написали — у всех клиентов |
Где создавать объекты:
| Задача | Explorer → Insert Object |
|---|---|
| Сервер | ServerScriptService → Script |
| Клиент | StarterPlayer → StarterPlayerScripts → LocalScript |
| Библиотека | ReplicatedStorage → ModuleScript |
| Логика одного куба | Part → Script (сервер, если Part в Workspace) |
Стартовые скрипты
Шаблон Baseplate: пол, SpawnLocation, один локальный игрок в Play.
Первый скрипт — print в Output
Запрос: roblox hello world script, roblox print example.
Задача: убедиться, что Script вообще запускается.
Настройка: ServerScriptService → Script → имя HelloPrint.
print("Привет, Roblox!")
print("Скрипт работает")
Что увидите в Play: в Output две белые строки сразу после старта.
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
print("...") | Текст в Output | Аналог console.log в JavaScript |
| Две строки подряд | Выполняются сверху вниз | Порядок = порядок в файле |
Что попробовать: print(2 + 2) → в Output будет 4.
Part красный при старте игры
Запрос: roblox change part color script.
Задача: куб на карте становится красным без ручной покраски в Properties.
Настройка:
- Workspace → Part (или используйте Baseplate).
- ПКМ на Part → Insert Object → Script.
--!strict
local part = script.Parent :: BasePart
part.Color = Color3.fromRGB(255, 0, 0)
part.Material = Enum.Material.Neon
Что увидите в Play: Part светится красным (Neon).
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
script.Parent | Объект-родитель Script (этот Part) | Script лежит внутри Part |
:: BasePart | Подсказка типа для --!strict | Studio знает, что есть .Color |
Color3.fromRGB(255, 0, 0) | Цвет из трёх чисел 0…255 | R=255, G=0, B=0 — красный |
Material = Neon | Материал «неон» | Ярче видно на уроке |
Разбор по смыслу:
script— всегда «этот» Script, который выполняется.- Цвет можно менять и в Properties без кода; скрипт нужен, когда цвет зависит от события (касание, счёт).
Приветствие при входе игрока
Запрос: roblox PlayerAdded script, print player name when join.
Задача: при входе в Play в Output появляется ник игрока.
Настройка: ServerScriptService → Script HelloServer.
--!strict
local Players = game:GetService("Players")
local function onPlayerAdded(player: Player)
print("Игрок на сервере:", player.Name)
end
Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do
onPlayerAdded(player)
end
Что увидите в Play: Игрок на сервере: ВашНик (локальный тестовый игрок).
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
local function onPlayerAdded(player: Player) | Именованная функция с типом аргумента | Удобно передать в Connect |
player.Name | Строка-ник | В Tab и в чате |
PlayerAdded:Connect(onPlayerAdded) | «Когда игрок зашёл — вызови функцию» | Основной паттерн Roblox |
for _, player in GetPlayers() | Перебор уже сидящих игроков | Script мог загрузиться после вашего входа в Play |
_ в for _, player | Номер в списке не нужен | Идиома Luau |
Разбор по смыслу:
- Событие в Roblox — не
ifкаждый кадр, а «вызови один раз, когда случилось». - Без цикла
GetPlayers()в учебном Play иногда нет строки в Output — кажется, что скрипт сломан.
Что попробовать: print(player.UserId) — числовой ID аккаунта (для DataStore).
Вращающийся Part
Запрос: roblox spin part script, rotate part Heartbeat.
Задача: платформа на финише obby крутится — визуальный ориентир.
Настройка:
- Part
Spinner, Anchored ✓. - Script внутри
Spinner.
--!strict
local RunService = game:GetService("RunService")
local part = script.Parent :: BasePart
local DEG_PER_SECOND = 90
RunService.Heartbeat:Connect(function(dt: number)
part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(DEG_PER_SECOND) * dt, 0)
end)
Что увидите в Play: Part плавно крутится вокруг вертикали; полный оборот ~4 с при 90 град/с.
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
RunService | Сервис «кадры» игры | Циклы без while true вручную |
Heartbeat:Connect(function(dt) ... end) | Каждый кадр вызывается функция | dt — секунды с прошлого кадра |
part.CFrame | Позиция + поворот | Одно свойство вместо Position + Rotation |
CFrame.Angles(0, угол, 0) | Поворот вокруг оси Y (вертикаль) | «Карусель» |
math.rad(...) | Градусы → радианы | Angles ждёт радианы |
* dt | Угол за этот кадр | Без dt скорость зависит от FPS |
Разбор по смыслу:
- Аналог бесконечного цикла в Turtle, но движок сам вызывает функцию каждый кадр — не зависает весь сервер.
DEG_PER_SECOND = 180— в два раза быстрее.
Кирпич-смерть (лава, Touched)
Запрос: roblox kill brick script, lava touched humanoid, kill part roblox.
Задача: красный Part убивает персонажа при касании — классика obby.
Настройка:
- Part
Lava, красный цвет, Anchored ✓, размер достаточный (например 20×1×20). - Script внутри
Lava.
--!strict
local part = script.Parent :: BasePart
local function onTouched(other: BasePart)
local character = other.Parent
if not character then
return
end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
part.Touched:Connect(onTouched)
Что увидите в Play: зашли на красный Part — персонаж умер и появился у SpawnLocation.
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
onTouched(other: BasePart) | other — Part, который коснулся (часто нога/торс) | Roblox передаёт «кто ударился» |
other.Parent | Обычно Model персонажа | У Part родитель — не Player, а модель |
if not character then return end | Защита от мусорных касаний | Без этого — ошибка на следующей строке |
FindFirstChildOfClass("Humanoid") | Ищет Humanoid в модели | У декора в Workspace Humanoid нет |
Health = 0 | Смерть | Движок сам респавнит |
Touched:Connect | Подписка на касания | Много раз за одно падение — нормально |
Разбор по смыслу:
- Цепочка: нога (Part) → модель персонажа → Humanoid → Health.
- Если лава «не убивает» — чаще всего касается не Humanoid, а пола; увеличьте Part по Y.
Чек-лист:
| Проверка | |
|---|---|
Script внутри Part Lava | |
| CanTouch включён | |
| Персонаж реально касается (не пролетает сквозь тонкий слой) | |
| В Output нет красных ошибок |
Что попробовать: humanoid.Health = 50 — половина жизни вместо смерти.
Монетка и leaderstats
Запрос: roblox coin script, leaderstats coins, collect coin touched, IntValue roblox.
Задача: жёлтая сфера исчезает при касании; в Tab появляется Coins: 1.
Настройка (два скрипта):
- ServerScriptService → Script
LeaderstatsSetup— код ниже первым. - Workspace → Part, форма Ball, имя
Coin, Anchored ✓, CanCollide выкл. - Внутри
Coin→ ScriptCoinPickup.
Схема:
Игрок касается Coin
→ CoinPickup (Script на монетке)
→ находит Player по модели персонажа
→ coins.Value += 1 (сервер)
→ Tab показывает leaderstats
→ CoinUI (LocalScript) обновляет TextLabel
LeaderstatsSetup (ServerScriptService)
--!strict
local Players = game:GetService("Players")
local function setupLeaderstats(player: Player)
local folder = Instance.new("Folder")
folder.Name = "leaderstats"
folder.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 0
coins.Parent = folder
end
Players.PlayerAdded:Connect(setupLeaderstats)
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
Instance.new("Folder") | Создаёт пустую папку в памяти | Контейнер для счёта |
folder.Name = "leaderstats" | Имя строго leaderstats | Иначе Tab Roblox не покажет таблицу |
folder.Parent = player | Папка внутри объекта Player | Живёт на сервере, видна клиентам |
Instance.new("IntValue") | Целое число | Монеты, убийства, этап — всё IntValue |
coins.Name = "Coins" | Заголовок столбца в Tab | Можно Stage, Wins |
Value = 0 | Старт с нуля | |
PlayerAdded:Connect | Каждому новому игроку — своя папка |
CoinPickup (Script внутри Coin)
--!strict
local coin = script.Parent :: BasePart
local collected = false
local function onTouched(other: BasePart)
if collected then
return
end
local character = other.Parent
if not character then
return
end
local player = game:GetService("Players"):GetPlayerFromCharacter(character)
if not player then
return
end
local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats and leaderstats:FindFirstChild("Coins") :: IntValue?
if not coins then
return
end
collected = true
coins.Value += 1
coin.Transparency = 1
coin.CanTouch = false
end
coin.Touched:Connect(onTouched)
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
collected = false | Флаг «уже подобрали» | Touched срабатывает десятки раз за секунду |
if collected then return end | Второй раз не начислять | Без этого Coins +10 за одно касание |
GetPlayerFromCharacter(character) | Player из модели ног/торса | В Touched приходит Part, не Player |
FindFirstChild("leaderstats") | Ищет папку | Может ещё не создана — тогда nil |
leaderstats and ... FindFirstChild("Coins") | Два шага без ошибки | Паттерн «если есть папка — ищи Coins» |
coins.Value += 1 | Увеличить счёт на сервере | Все игроки видят в Tab |
Transparency = 1 | Полностью прозрачный | Монетка «исчезла», объект остался для отладки |
CanTouch = false | Больше не ловит Touched | Дополнительная защита |
Что увидите в Play: коснулись шара — он пропал; Tab → Coins: 1.
Что попробовать:
task.delay(5, function()
collected = false
coin.Transparency = 0
coin.CanTouch = true
end)
Вставьте после сбора — монетка вернётся через 5 секунд.
Прыжковая платформа
Запрос: roblox jump pad script, JumpPower boost, jump boost part.
Задача: зелёный Part подбрасывает вверх — короткий obby-прыжок.
Настройка: Part JumpPad, зелёный, Anchored ✓, Script внутри.
--!strict
local pad = script.Parent :: BasePart
local BOOST = 80
local function onTouched(other: BasePart)
local character = other.Parent
if not character then
return
end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid.JumpPower = BOOST
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
end
pad.Touched:Connect(onTouched)
Что увидите в Play: наступили на зелёный блок — персонаж подпрыгнул выше обычного.
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
BOOST = 80 | Константа силы прыжка | Меняете одно число в Inspector-стиле |
JumpPower = BOOST | Задаёт силу прыжка Humanoid | В старых шаблонах |
ChangeState(Jumping) | Принудительный прыжок | Срабатывает сразу при касании, не ждёт Space |
В новых шаблонах Roblox вместо JumpPower может быть JumpHeight. Откройте Humanoid персонажа в Play → Properties. Если JumpPower нет — замените строку на humanoid.JumpHeight = 50 (подберите число). Документация — create.roblox.com.
Спринт по Left Shift (LocalScript)
Запрос: roblox sprint script, WalkSpeed LocalScript, shift to run roblox.
Задача: зажали Shift — бег быстрее; отпустили — снова обычная ходьба.
Настройка: StarterPlayer → StarterPlayerScripts → LocalScript SprintClient.
--!strict
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
local NORMAL = 16
local SPRINT = 28
local function getHumanoid(): Humanoid?
local character = player.Character
if not character then
return nil
end
return character:FindFirstChildOfClass("Humanoid")
end
UserInputService.InputBegan:Connect(function(input, processed)
if processed then
return
end
if input.KeyCode == Enum.KeyCode.LeftShift then
local hum = getHumanoid()
if hum then
hum.WalkSpeed = SPRINT
end
end
end)
UserInputService.InputEnded:Connect(function(input, _processed)
if input.KeyCode == Enum.KeyCode.LeftShift then
local hum = getHumanoid()
if hum then
hum.WalkSpeed = NORMAL
end
end
end)
player.CharacterAdded:Connect(function()
local hum = getHumanoid()
if hum then
hum.WalkSpeed = NORMAL
end
end)
Что увидите в Play: Shift — бег; отпустили — снова 16 studs/s (стандарт Roblox).
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
UserInputService | Клавиатура/мышь этого клиента | Сервер не видит Shift |
InputBegan | Клавишу нажали | Старт спринта |
InputEnded | Клавишу отпустили | Вернуть скорость |
processed | true — ввод съел UI (чат) | Не спринтовать при наборе в чате |
Enum.KeyCode.LeftShift | Константа клавиши | Не строка "LeftShift" |
getHumanoid() | Humanoid текущего персонажа | После смерти модель новая |
CharacterAdded | Событие «новый персонаж после респавна» | Сброс WalkSpeed после лавы |
NORMAL = 16 | Дефолт Roblox | |
SPRINT = 28 | ~1.75× быстрее | Подберите на вкус |
Разбор по смыслу:
- Это LocalScript — на сервере тот же код с
LocalPlayerработает, на Script — нет. - В реальной игре читеры меняют
WalkSpeedна клиенте; в продакшене скорость проверяют на сервере.
UI — надпись «Монеты: N»
Запрос: roblox TextLabel update, screen gui score script, leaderstats gui.
Задача: на экране текст обновляется при сборе монет (пример с leaderstats).
Настройка:
- StarterGui → ScreenGui → TextLabel, имя
CoinLabel, Text =Монеты: 0, Size в Properties. - ПКМ на
CoinLabel→ LocalScriptCoinUI(родитель = TextLabel).
--!strict
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local label = script.Parent :: TextLabel
local function updateCoins()
local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats and leaderstats:FindFirstChild("Coins") :: IntValue?
if coins then
label.Text = "Монеты: " .. tostring(coins.Value)
end
end
local function hookCoins()
local leaderstats = player:WaitForChild("leaderstats", 10)
if not leaderstats then
warn("leaderstats не найден за 10 с")
return
end
local coins = leaderstats:WaitForChild("Coins", 10) :: IntValue?
if not coins then
return
end
updateCoins()
coins.Changed:Connect(updateCoins)
end
player.CharacterAdded:Connect(hookCoins)
if player:FindFirstChild("leaderstats") then
hookCoins()
end
Что увидите в Play: собрали монетку — надпись Монеты: 1 без перезапуска.
Разбор построчно:
| Строка | Что происходит | Зачем |
|---|---|---|
script.Parent :: TextLabel | UI-элемент, внутри которого лежит скрипт | label.Text — свойство надписи |
"Монеты: " .. tostring(coins.Value) | Склейка строк | .. — как + для строк в Python |
WaitForChild("leaderstats", 10) | Ждёт папку до 10 с | Сервер создаёт её чуть позже клиента |
warn(...) | Жёлтое предупреждение в Output | Понятнее, чем молчание |
coins.Changed:Connect | При каждом Value += 1 на сервере | UI сам обновляется |
CharacterAdded + hookCoins | После смерти переподписка | Иначе UI «застынет» |
Разбор по смыслу:
- Сервер меняет число; клиент только показывает — правильное разделение.
- Не пишите
coins.Value += 1в LocalScript для честной игры.
RemoteEvent — нажал E, сервер добавил монету
Запрос: roblox RemoteEvent tutorial, FireServer example, OnServerEvent.
Задача: игрок жмёт E; сервер добавляет +1 Coins (клиент не ворует счёт).
Настройка:
- ReplicatedStorage → RemoteEvent → имя
AddCoinRequest. - ServerScriptService → Script
CoinServer. - StarterPlayerScripts → LocalScript
CoinClient. - Работает с LeaderstatsSetup.
CoinServer (сервер)
--!strict
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local event = ReplicatedStorage:WaitForChild("AddCoinRequest") :: RemoteEvent
local COOLDOWN = 1
local lastPress: { [Player]: number } = {}
event.OnServerEvent:Connect(function(player: Player)
local now = os.clock()
local prev = lastPress[player] or 0
if now - prev < COOLDOWN then
return
end
lastPress[player] = now
local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats and leaderstats:FindFirstChild("Coins") :: IntValue?
if coins then
coins.Value += 1
print(player.Name, "получил монету. Всего:", coins.Value)
end
end)
Разбор построчно (сервер):
| Строка | Что происходит | Зачем |
|---|---|---|
WaitForChild("AddCoinRequest") | Ждёт RemoteEvent в ReplicatedStorage | Имя должно совпадать с Explorer |
OnServerEvent:Connect(function(player) ...) | Клиент вызвал FireServer | player — кто нажал E (не доверяйте аргументам клиента для identity) |
lastPress[player] | Таблица «последний раз нажал» | У каждого игрока свой кулдаун |
os.clock() | Время в секундах | Для антиспама |
if now - prev < COOLDOWN | Чаще 1 раз/с — игнор | Защита от макросов |
coins.Value += 1 на сервере | Единственное честное место |
CoinClient (клиент)
--!strict
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UserInputService = game:GetService("UserInputService")
local event = ReplicatedStorage:WaitForChild("AddCoinRequest") :: RemoteEvent
UserInputService.InputBegan:Connect(function(input, processed)
if processed then
return
end
if input.KeyCode == Enum.KeyCode.E then
event:FireServer()
end
end)
Разбор построчно (клиент):
| Строка | Что происходит | Зачем |
|---|---|---|
FireServer() | «Попроси сервер сделать действие» | Без аргументов — просто сигнал «нажали E» |
Только FireServer, без Value += 1 | Клиент не меняет счёт | Иначе читеры |
Что увидите в Play: E → +1 в Tab и строка в Output с именем и счётом.
Клиент может вызвать FireServer тысячу раз из эксплойта — сервер обязан проверять кулдаун, дистанцию, наличие предмета. В учебном obby достаточно COOLDOWN; в магазине — ещё цена и баланс на сервере.
ModuleScript — вынести код в модуль
Запрос: roblox require ModuleScript, return module table.
Задача: приветствие в одном файле, вызов из нескольких Script.
Настройка:
- ReplicatedStorage → ModuleScript
HelloUtil. - ServerScriptService → Script
UseHello.
HelloUtil (ModuleScript):
--!strict
local HelloUtil = {}
function HelloUtil.greet(player: Player): string
return "Привет, " .. player.Name .. "!"
end
return HelloUtil
UseHello (Script):
--!strict
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local HelloUtil = require(ReplicatedStorage:WaitForChild("HelloUtil"))
Players.PlayerAdded:Connect(function(player)
print(HelloUtil.greet(player))
end)
Разбор ModuleScript:
| Строка | Что происходит | Зачем |
|---|---|---|
local HelloUtil = {} | Пустая таблица — «модуль» | В неё кладут функции |
function HelloUtil.greet(...) | Метод модуля | Вызов: HelloUtil.greet(player) |
return HelloUtil | Что вернёт require | Без return — require даст пустоту |
Разбор Script:
| Строка | Что происходит | Зачем |
|---|---|---|
require(...) | Загрузить ModuleScript один раз | Кэш — повторный require быстрый |
WaitForChild("HelloUtil") | Имя = имя объекта в Explorer | Опечатка → бесконечное ожидание |
Разбор по смыслу:
- Один ServerHandler + модули
CoinService,StageService— так строят практикум obby.
Примеры посложнее
Случайный цвет при каждом касании
Запрос: roblox random color part touched.
--!strict
local part = script.Parent :: BasePart
part.Touched:Connect(function()
part.Color = Color3.fromRGB(
math.random(0, 255),
math.random(0, 255),
math.random(0, 255)
)
end)
| Строка | Что происходит | Зачем |
|---|---|---|
Touched:Connect(function() ... end) | Анонимная функция без other | Цвет меняется при любом касании |
math.random(0, 255) | Случайное целое | Три канала RGB |
| На сервере | random честный для всех | На клиенте — только для себя |
Таймер обратного отсчёта в Output
Запрос: roblox countdown script, task.wait loop.
--!strict
local SECONDS = 10
for t = SECONDS, 1, -1 do
print("Старт через", t)
task.wait(1)
end
print("Поехали!")
| Строка | Что происходит | Зачем |
|---|---|---|
for t = SECONDS, 1, -1 | t = 10, 9, … 1 | Третье число — шаг −1 |
task.wait(1) | Пауза 1 с | Не блокирует весь сервер как старый wait() |
Что увидите: десять строк в Output, затем Поехали!.
Спавн падающих кубов
Запрос: roblox spawn part script, Clone Instance.
--!strict
local ServerStorage = game:GetService("ServerStorage")
local template = ServerStorage:WaitForChild("FallingCube") :: BasePart
while true do
local clone = template:Clone()
clone.Position = Vector3.new(math.random(-20, 20), 30, math.random(-20, 20))
clone.Parent = workspace
task.delay(5, function()
clone:Destroy()
end)
task.wait(2)
end
Настройка: Part FallingCube в ServerStorage, Anchored выкл.
| Строка | Что происходит | Зачем |
|---|---|---|
ServerStorage | Игроки не видят шаблон | Хранилище «заготовок» |
Clone() | Копия Part | Оригинал остаётся |
Vector3.new(x, y, z) | Позиция в мире | Y=30 — высоко над картой |
Parent = workspace | Клон появился в игре | |
task.delay(5, function() clone:Destroy() end) | Удалить через 5 с | Не копить мусор |
while true + task.wait(2) | Каждые 2 с новый куб | Бесконечный спавн |
Частые ошибки новичка
| Симптом | Что гуглят | Причина | Решение |
|---|---|---|---|
attempt to index nil | roblox nil error | FindFirstChild не нашёл объект | if obj then, WaitForChild, проверьте Explorer |
LocalPlayer is nil | LocalPlayer nil server | Script на сервере | LocalScript в StarterPlayerScripts |
| Скрипт серый | script won't run | LocalScript не в том месте | Только StarterPlayerScripts / StarterGui / Tool |
Touched молчит | touched not working | Нет контакта, маленький Part | Увеличить Part, CanTouch |
| Coins +10 за раз | coin gives too many | Много Touched | Флаг collected |
| UI всегда 0 | textlabel not updating | Нет Changed / нет leaderstats | UI пример |
| RemoteEvent ничего | FireServer not working | Не тот родитель / имя | ReplicatedStorage, имена совпадают |
HelloUtil is not a valid member | require module error | Нет return в ModuleScript | return HelloUtil в конце модуля |
View → Output. Красная строка: файл и номер — двойной клик откроет скрипт. Перед сдачей лабораторной сделайте скрин Output без ошибок в Play.
Мини-проект — obby за один вечер
Соберите на Baseplate (порядок важен):
| Шаг | Объект | Раздел |
|---|---|---|
| 1 | LeaderstatsSetup в ServerScriptService | Монетка |
| 2 | 5× Part Coin | Монетка |
| 3 | Part Lava между платформами | Лава |
| 4 | Part JumpPad | Прыжок |
| 5 | SprintClient LocalScript | Спринт |
| 6 | ScreenGui + CoinUI | UI |
| 7 | Spinner на финише | Вращение |
Что сказать на защите: «Счёт и сбор монет на сервере, UI и спринт на клиенте, лава через Touched и Humanoid».
Полный obby с чекпоинтами и DataStore — практикум 204.
Сравнение с Python Turtle
| Идея | Turtle | Roblox Luau |
|---|---|---|
| Повторение | for i in range(4) | for t = 10, 1, -1 |
| «Сделай что-то много раз» | цикл + forward | Heartbeat:Connect |
| Реакция на действие | редко (клик) | Touched, PlayerAdded |
| Счёт очков | переменная в коде | leaderstats + Tab |
| Где запуск | Python на ПК | F5 в Studio |
Если вы прошли Turtle, в Roblox те же навыки: переменная → условие → цикл → функция → событие.
Куда дальше
- Roblox Studio — первая игра — Place, публикация.
- Разработка на Roblox — клиент–сервер, FilteringEnabled.
- Luau в Roblox — типы,
task, API. - Справочник по Roblox — Instance, DataStore.
- Unity C# — скрипты — другой движок, те же механики.
- Маршрут Roblox + Luau.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Практическая карта типовых IT-задач: термины, пошаговое внедрение, проверка качества и типичные ошибки. Простой консольный чат на C# — учебное приложение с сокетами: TCP между клиентом и сервером, многопоточность и обмен сообщениями в консоли. Примеры вёрстки на HTML и CSS с разбором: центрирование, Flexbox, Grid, формы, шапка, подвал и адаптив для учебы и портфолио. Перед началом работы обязательно изучите главу Turtle . Галерея 3D-фигур на Panda3D — карточки, куб, пирамида, сфера, сетки и составные сцены; код для локального запуска. Готовые docker-compose.yml с разбором каждой строки — nginx, PostgreSQL, Redis, WordPress, MongoDB. Примеры для школьников и студентов: postgres example, поднять базу локально, app + db. Примеры nginx.conf для статики, reverse proxy, React/Vue SPA, PHP, SSL и балансировки — построчный разбор директив, проверка curl и типичные ошибки для лабораторных и VPS. dockerfile example — 10 готовых Dockerfile с построчным разбором: node, python, golang, react nginx, spring boot, php, dotnet. Для студентов, лабораторных и docker build с нуля. PromQL example — готовые запросы Prometheus и Grafana с построчным разбором: up, rate, node_exporter cpu, memory, disk, http_requests_total, histogram_quantile p99, алерты. Для студентов, лабораторных и devops docker compose. Готовые манифесты Kubernetes с разбором каждой строки — Pod, Deployment, Service, ConfigMap, Secret, Ingress. Примеры для Minikube, kind и kubectl apply. Примеры графиков Matplotlib на Python для школьников и студентов — sin, cos, парабола, столбцы, scatter, гистограмма, подграфики; код с подробным разбором. Примеры pandas на Python для школьников и студентов — DataFrame, фильтрация, groupby, очистка, merge, сводные таблицы и экспорт; код с подробным разбором каждой строки.Готовые решения
Простой консольный чат на CSharp
HTML + CSS — готовые макеты
Примеры фигур Turtle на Python
Примеры фигур Panda3D на Python
Docker Compose — готовые стеки
Nginx — конфиги под задачу
Dockerfile — 10 типовых образов
Prometheus + Grafana — запросы
Kubernetes YAML — минимальные манифесты
Matplotlib — графики
Pandas — типовые операции