Luau с нуля: переменные, условия, циклы и события
Язык, на котором написаны все игры Roblox, за один заход. Шесть тем, в каждой — короткий рабочий пример, который можно вставить в Studio и запустить.
Средне 35 минут проверен 3 часа назад
Что понадобится
Установленная Roblox Studio и открытый проект. Если Studio ещё не открывал — начни с гайда про первую игру, там разобран интерфейс.
Текст гайда «Luau с нуля: переменные, условия, циклы и события»
Содержание
Luau — это диалект языка Lua, доработанный самой Roblox. Он простой: нет точек с запятой, нет фигурных скобок, а типы можно не указывать. Код в Studio живёт в объектах Script и LocalScript, а проверять примеры удобнее всего в панели Output — туда пишет команда print.
Переменные#
Переменная объявляется словом local. Писать его нужно почти всегда: без local переменная становится глобальной и видна другим частям кода, что рано или поздно приводит к странным ошибкам.
local playerName = "Артём" -- строка
local coins = 25 -- число
local isAlive = true -- логическое значение
local inventory = {"меч", "щит"} -- таблица
print(playerName, coins, isAlive, inventory[1])Таблица — единственная структура данных в языке, и она заменяет и список, и словарь. Нумерация в списках начинается с единицы, а не с нуля: inventory[1] — это «меч».
Условия#
local coins = 25
if coins >= 100 then
print("Хватает на редкий предмет")
elseif coins >= 10 then
print("Хватает на обычный предмет")
else
print("Пока не на что")
endЛожными считаются только false и nil. Ноль и пустая строка — истина, в отличие от многих других языков. Отрицание пишется словом not, а «и» с «или» — and и or.
Циклы#
for i = 1, 5 do
print("Шаг номер " .. i)
end
local fruits = {"яблоко", "груша", "слива"}
for index, fruit in ipairs(fruits) do
print(index, fruit)
endДве точки подряд — это склейка строк, а не сложение. Число к строке приклеивается само, преобразовывать его не нужно.
Бесконечный цикл без паузы вешает игру
Внутри while true do обязательно должна быть строка task.wait(). Без неё цикл выполнится миллионы раз за секунду и сервер перестанет отвечать.
Функции#
local function greet(name)
return "Привет, " .. name .. "!"
end
print(greet("Соня"))Функция объявляется до того места, где её вызывают, — код читается сверху вниз. Аргументов может не быть вовсе, а возвращать функция умеет сразу несколько значений через запятую.
Объекты игры#
Всё в мире Roblox — дерево объектов, и до любого можно дотянуться из кода. Сервисы берут через game:GetService, соседние объекты ищут методами поиска, а не по прямому пути: путь ломается, стоит кому-то переименовать папку.
local part = Instance.new("Part")
part.Size = Vector3.new(8, 1, 8)
part.Position = Vector3.new(0, 10, 0)
part.BrickColor = BrickColor.new("Bright blue")
part.Anchored = true
part.Parent = workspaceСтрока part.Parent = workspace идёт последней не случайно: пока у объекта нет родителя, его нет и в мире. Сначала настраиваем, потом показываем — так деталь не мелькает в игре недоделанной.
События#
Событие — это способ сказать «сделай вот это, когда произойдёт вот то». Подписка делается методом Connect, и почти вся игровая логика в Roblox устроена именно так.
local coin = script.Parent
local Players = game:GetService("Players")
coin.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if not player then
return
end
print(player.Name .. " подобрал монету")
coin:Destroy()
end)Ранний выход вместо вложенных условий
Строка if not player then return end отсекает лишние случаи в самом начале. Так основной код остаётся слева, без лесенки из вложенных условий, — привычка, которая экономит часы при отладке.
Куда двигаться дальше#
- Сервер и клиент: что делает Script, что LocalScript и почему это важно для честной игры
- RemoteEvent — способ передать действие с клиента на сервер
- leaderstats — таблица очков, которая показывается в списке игроков
- DataStore — сохранение прогресса между сессиями
- Официальная документация Roblox по Luau — она есть на русском и хорошо написана
Если ещё не собирал ни одного проекта, начни с гайда «Первая игра в Roblox Studio» — там тот же код разобран на живом примере с полосой препятствий.
Обсуждение
Пиши по делу и без личных данных. Ссылки на сторонние сайты, обмен и «бесплатные робуксы» мы скрываем — почему.
Комментарии пишут те, кто вошёл — так спокойнее всем.
ВойтиПока никто ничего не написал. Будь первым.