Studio

Luau с нуля: переменные, условия, циклы и события

Язык, на котором написаны все игры Roblox, за один заход. Шесть тем, в каждой — короткий рабочий пример, который можно вставить в Studio и запустить.

Средне 35 минут проверен 3 часа назад

Что понадобится

Установленная Roblox Studio и открытый проект. Если Studio ещё не открывал — начни с гайда про первую игру, там разобран интерфейс.

Текст гайда «Luau с нуля: переменные, условия, циклы и события»

Содержание

Luau — это диалект языка Lua, доработанный самой Roblox. Он простой: нет точек с запятой, нет фигурных скобок, а типы можно не указывать. Код в Studio живёт в объектах Script и LocalScript, а проверять примеры удобнее всего в панели Output — туда пишет команда print.

Переменные#

Переменная объявляется словом local. Писать его нужно почти всегда: без local переменная становится глобальной и видна другим частям кода, что рано или поздно приводит к странным ошибкам.

Четыре типа, которые встречаются чаще всего · Luau
local playerName = "Артём"   -- строка
local coins = 25              -- число
local isAlive = true          -- логическое значение
local inventory = {"меч", "щит"} -- таблица

print(playerName, coins, isAlive, inventory[1])

Таблица — единственная структура данных в языке, и она заменяет и список, и словарь. Нумерация в списках начинается с единицы, а не с нуля: inventory[1] — это «меч».

Условия#

if, elseif, else · Luau
local coins = 25

if coins >= 100 then
    print("Хватает на редкий предмет")
elseif coins >= 10 then
    print("Хватает на обычный предмет")
else
    print("Пока не на что")
end

Ложными считаются только false и nil. Ноль и пустая строка — истина, в отличие от многих других языков. Отрицание пишется словом not, а «и» с «или» — and и or.

Циклы#

Перебор и повтор · Luau
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(). Без неё цикл выполнится миллионы раз за секунду и сервер перестанет отвечать.

Функции#

Своя функция с аргументом и возвратом · Luau
local function greet(name)
    return "Привет, " .. name .. "!"
end

print(greet("Соня"))

Функция объявляется до того места, где её вызывают, — код читается сверху вниз. Аргументов может не быть вовсе, а возвращать функция умеет сразу несколько значений через запятую.

Объекты игры#

Всё в мире Roblox — дерево объектов, и до любого можно дотянуться из кода. Сервисы берут через game:GetService, соседние объекты ищут методами поиска, а не по прямому пути: путь ломается, стоит кому-то переименовать папку.

Создание детали из кода · Luau
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 устроена именно так.

Монета, которая исчезает при касании · Luau
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» — там тот же код разобран на живом примере с полосой препятствий.

Обсуждение

Пиши по делу и без личных данных. Ссылки на сторонние сайты, обмен и «бесплатные робуксы» мы скрываем — почему.

Комментарии пишут те, кто вошёл — так спокойнее всем.

Войти

Пока никто ничего не написал. Будь первым.