1. Основы функций: синтаксис, объявление и вызов в скриптах
Основы функций: синтаксис, объявление и вызов в скриптах
Добро пожаловать в курс «Функции в Luau для Roblox Studio». Это первая и фундаментальная статья, с которой начнется ваше погружение в мир структурированного программирования. Если вы когда-либо писали скрипт, который становился слишком длинным, запутанным и сложным для чтения, то функции — это именно тот инструмент, который спасет вас от хаоса.
В этой статье мы разберем, что такое функции, зачем они нужны, как их правильно создавать (объявлять) и как заставлять их работать (вызывать). Мы будем использовать язык Luau — это версия Lua, адаптированная специально для Roblox.
Что такое функция и зачем она нужна?
Представьте, что вы пишете инструкцию для робота, как приготовить бутерброд. Если вам нужно сделать один бутерброд, вы просто пишете список действий: взять хлеб, намазать масло, положить сыр. Но что, если вам нужно сделать 100 бутербродов в разных местах вашей программы?
Копировать и вставлять один и тот же код 100 раз — плохая идея. Это делает скрипт огромным, а если вы решите заменить сыр на колбасу, вам придется искать и менять это в 100 местах. Здесь на помощь приходят функции.
Функция — это именованный блок кода, который можно написать один раз, а затем использовать (вызывать) столько раз, сколько потребуется. Это своего рода «мини-программа» внутри вашей основной программы.
!Концептуальная схема работы функции: вход, обработка, выход.
Принцип DRY
В программировании существует золотое правило: DRY (Don't Repeat Yourself — Не повторяйся). Функции — главный инструмент соблюдения этого принципа. Если вы видите, что пишете один и тот же код дважды, скорее всего, его нужно вынести в функцию.
Синтаксис объявления функции
В Luau существует несколько способов объявления функций, но мы начнем с самого распространенного и рекомендуемого — локальной функции. Использование ключевого слова local делает функцию доступной только в пределах текущего скрипта, что работает быстрее и безопаснее.
Базовая структура выглядит так:
Давайте разберем каждую часть этой конструкции:
local: Указывает, что функция является локальной переменной.function: Ключевое слово, сообщающее Luau, что мы создаем функцию.имяФункции: Уникальное имя, которое вы придумываете. Оно должно быть понятным и описывать действие (например, createPart, calculateScore, killPlayer). Принято использовать стиль camelCase (первая буква маленькая, каждое следующее слово с большой).(): Круглые скобки. В них могут находиться параметры (о них мы поговорим чуть позже), но даже если их нет, скобки обязательны.-- Тело функции: Код между объявлением и концом функции. Он не выполняется сразу, а только «запоминается» компьютером.end: Ключевое слово, обозначающее конец блока функции.Пример в Roblox Studio
Откройте Roblox Studio, создайте Script в ServerScriptService и напишите следующий код:
Если вы запустите игру (Play), то... ничего не произойдет. В окне Output будет пусто. Почему? Потому что мы только объявили функцию (научили скрипт, как это делать), но не вызвали её (не дали команду выполнить).
Вызов функции
Чтобы код внутри функции сработал, к ней нужно обратиться по имени. Это называется вызовом (call).
Синтаксис вызова очень прост: вы пишете имя функции и обязательно ставите круглые скобки ().
Теперь, при запуске скрипта, Luau увидит команду sayHello(), найдет функцию с таким именем и выполнит код внутри неё. В консоли появится: Привет, Роблокс!.
Вы можете вызывать функцию сколько угодно раз:
Это приведет к троекратному выводу сообщения.
Важное правило: Порядок имеет значение
В Luau (в отличие от некоторых других языков) вы обязаны объявить локальную функцию до того, как попытаетесь её вызвать. Скрипт читается сверху вниз.
Ошибка:
Правильно:
Параметры и Аргументы
Функции становятся по-настоящему мощными, когда мы можем передавать в них данные. Для этого используются параметры и аргументы.
Параметры — это переменные, указанные в скобках при объявлении* функции. Они служат «заполнителями» для будущих данных. Аргументы — это конкретные значения, которые вы передаете в скобки при вызове* функции.
Рассмотрим пример функции, которая приветствует конкретного игрока:
Несколько параметров
Вы можете указывать сколько угодно параметров, разделяя их запятыми. Порядок передачи аргументов должен соответствовать порядку параметров.
Допустим, нам нужно изменить прозрачность детали. Нам нужно знать, какую деталь менять и насколько.
Если вы перепутаете порядок и напишете changeTransparency(0.5, myPart), скрипт выдаст ошибку, так как попытается присвоить число свойству Transparency объекта 0.5, что невозможно.
Возврат значений (Return)
Иногда нам нужно, чтобы функция не просто что-то сделала (например, написала в чат или поменяла цвет), а вернула результат вычислений обратно в основной код. Для этого используется ключевое слово return.
Представьте математическую операцию сложения. Мы даем два числа, а в ответ хотим получить их сумму.
Рассмотрим простую формулу:
где — сумма, — первое слагаемое, — второе слагаемое.
В коде это выглядит так:
Когда Luau встречает слово return, функция немедленно прекращает свою работу и «превращается» в то значение, которое стоит после return. В примере выше вызов addNumbers(10, 5) фактически заменяется на число 15.
Особенности return
return внутри того же блока функции, никогда не выполнится.Практический пример: Создание и настройка детали
Давайте объединим полученные знания и напишем полезную функцию для Roblox Studio. Мы создадим функцию, которая спавнит куб случайного цвета в указанной позиции.
В этом примере:
spawnCube.position.return part), чтобы мы могли изменить её свойства позже (например, прозрачность cube1).Область видимости (Scope) и локальные функции
Почему мы везде пишем local? В Luau переменные и функции могут быть глобальными или локальными.
* Global: Если не написать local, функция станет глобальной. Это считается плохой практикой, так как глобальные переменные медленнее и могут конфликтовать с другими скриптами или частями кода.
* Local: Локальная функция видна только в том блоке кода, где она создана. Это стандарт индустрии.
> Всегда используйте local function, если у вас нет веской причины делать иначе. Это сделает ваш код чище и быстрее.
Частые ошибки новичков
sayHello без () не вызовет функцию, а просто сошлется на неё как на переменную.end: Каждая функция должна закрываться ключевым словом end. Roblox Studio обычно подсказывает это, но будьте внимательны.Заключение
Сегодня вы сделали огромный шаг в изучении Luau. Функции — это скелет любого сложного проекта в Roblox. Они позволяют разбивать большие задачи на маленькие, управляемые части.
Краткий итог:
* Функции позволяют переиспользовать код.
* Объявляются через local function Name() ... end.
* Вызываются через Name().
* Могут принимать данные (параметры) и возвращать результаты (return).
В следующей статье мы углубимся в работу с событиями и узнаем, как вызывать функции не просто так, а когда игрок касается детали или нажимает кнопку.