1. Основы программирования на Lua: переменные, функции и циклы
Приветствую! В прошлый раз мы успешно освоились в интерфейсе Roblox Studio, научились перемещать объекты и настраивать их свойства вручную. Но настоящая магия создания игр начинается тогда, когда мир оживает без вашего прямого участия. Двери, которые открываются при приближении игрока, монеты, которые исчезают при сборе, и таймеры, отсчитывающие время до конца раунда — всё это работает благодаря коду.
Сегодня мы заложим фундамент вашего пути в программировании. Мы разберем три кита, на которых держится логика любой игры на языке Lua: переменные, функции и циклы.
Переменные: память вашей игры
Представьте, что вы переезжаете в новую квартиру. Чтобы не потерять вещи, вы складываете их в картонные коробки и подписываете маркером: «Посуда», «Книги», «Одежда». В программировании переменная — это такая же подписанная коробка, только хранится в ней не одежда, а информация.
Переменные позволяют игре «запоминать» данные: сколько у игрока здоровья, как зовут его питомца или открыт ли сундук с сокровищами.
В Lua создание переменной выглядит так:
Давайте разберем этот код:
local говорит движку: «Создай новую коробку прямо здесь и сейчас». Использование локальных переменных — это правило хорошего тона, которое защищает ваш код от путаницы.playerName, health, isAlive — это названия наших коробок. Мы придумываем их сами. Главное правило — название должно отражать суть того, что внутри.= означает не математическое равенство, а команду «положить в коробку». Мы берем значение справа и кладем его в переменную слева.!Визуализация переменных, функций и циклов
Типы данных
В наши «коробки» можно класть разные типы информации. В Lua есть три основных типа данных, с которыми вы будете работать 90% времени:
| Тип данных | Название в Lua | Пример | Зачем нужен в игре |
| :--- | :--- | :--- | :--- |
| Число | Number | 10, 3.14, -5 | Подсчет очков, координат, таймеров, урона. |
| Строка | String | "Привет", "Меч" | Текст на экране, имена игроков, названия предметов. Обязательно пишется в кавычках. |
| Логический | Boolean | true, false | Состояния: жив/мертв, день/ночь, дверь открыта/закрыта. |
> Программирование — это искусство управления данными. Если вы понимаете, какие данные у вас есть и как они меняются, вы уже наполовину написали игру. > > Билл Гейтс
Мысленный эксперимент: Представьте, что вы создаете систему инвентаря. Какие переменные вам понадобятся для одного яблока? Вероятно, строка для названия ("Яблоко"), число для силы исцеления (15) и число для веса предмета (0.5).
Функции: действия и механизмы
Если переменные — это существительные нашего игрового мира (имя, здоровье, скорость), то функции — это глаголы (прыгнуть, получить урон, открыть инвентарь).
Функция — это изолированный блок кода, который выполняет конкретную задачу. Вы можете написать этот блок один раз, а затем вызывать его сотни раз в разных частях игры.
Аналогия из реальной жизни: автомат по продаже кофе. Вы не знаете, как именно он мелет зерна и кипятит воду. Вы просто даете ему монету и нажимаете кнопку (передаете данные), а он выдает вам стаканчик капучино (возвращает результат).
Синтаксис функции в Lua выглядит так:
Разберем анатомию этого механизма:
local function — объявление о том, что мы строим новый механизм.takeDamage — имя функции.(currentHealth, damageAmount) — это параметры. Те самые «монетки», которые мы бросаем в автомат. Это данные, необходимые функции для работы.return — команда выдачи результата. Функция отдает нам вычисленное значение, чтобы мы могли сохранить его в переменную.Если текущее здоровье игрока , а урон от ловушки , то новое здоровье вычисляется по формуле . В нашем примере , а , поэтому после выполнения функции здоровье становится равным 80.
Сократовский вопрос: Как вы думаете, что произойдет, если мы вызовем функцию takeDamage, но забудем передать ей значение урона? Автомат сломается, потому что попытается вычесть пустоту из числа. Поэтому всегда следите за тем, какие данные ожидает ваша функция.
Циклы: автоматизация рутины
Представьте, что вам нужно построить лестницу из 100 ступенек в Roblox Studio. Вы можете вручную скопировать и вставить блок 100 раз, каждый раз сдвигая его чуть выше. Это долго и скучно.
Для таких задач существуют циклы — конструкции, которые заставляют код повторяться определенное количество раз или до выполнения заданного условия.
Цикл for (для точного количества повторений)
Цикл for идеально подходит, когда вы заранее знаете, сколько раз нужно выполнить действие.
Здесь переменная i (от слова index) — это счетчик. Он начинает с и увеличивается на единицу с каждым кругом, пока не достигнет . Код внутри цикла выполнится ровно пять раз.
Цикл while (пока условие истинно)
Цикл while работает иначе. Он повторяет код до тех пор, пока определенное условие остается правдивым (true). Это похоже на бег на беговой дорожке: вы бежите пока у вас есть силы.
В этом примере цикл проверяет математическое условие: . Как только переменная станет равна нулю, условие превратится в ложь (false), и цикл остановится.
Критически важное правило для Roblox: Внутри цикла while всегда должна быть пауза, например task.wait(). Если вы заставите игру бесконечно считать без пауз, процессор попытается выполнить миллионы операций за долю секунды, и Roblox Studio просто зависнет.
Объединяем знания: создаем механику отравления
Давайте посмотрим, как переменные, функции и циклы работают вместе в реальном игровом сценарии. Напишем логику ядовитого болота: когда игрок наступает в него, он получает урон каждую секунду в течение 5 секунд.
Проследите за логикой: мы сохранили настройки в переменные, передали здоровье в функцию, а внутри функции использовали цикл for, чтобы отнять здоровье 5 раз с интервалом в секунду. В конце функция вернула обновленное здоровье.
Подведение итогов
Сегодня мы сделали огромный шаг от визуального редактора к написанию реальной логики:
for) или пока выполняется условие (while).Ваше комплексное задание для размышления:
Подумайте, как с помощью изученных сегодня инструментов создать систему квестов. У вас должна быть переменная для хранения количества собранных волшебных камней. Вам понадобится функция collectStone(), которая будет увеличивать эту переменную. И, возможно, цикл while, который будет проверять, не достигло ли количество камней нужной отметки (например, 10), чтобы выдать игроку награду.
В следующей статье мы научимся привязывать этот код к реальным объектам в мире Roblox: заставим блоки менять цвет при касании и создавать эффекты. До встречи в студии!