Модули: как перестать копировать код между скриптами
Выносить общий код в модуль и подключать его из разных скриптов.
Теория
ModuleScript сам по себе не выполняется. Он возвращает значение — почти всегда таблицу с функциями — и это значение получает тот, кто вызвал require.
Модуль выполняется один раз на сторону: первый require запускает его код, все следующие получают уже готовый результат. Поэтому в модуле удобно хранить общие настройки и состояние.
Лежат модули обычно в ReplicatedStorage, если нужны обеим сторонам, и в ServerScriptService, если это серверная логика, которую клиенту видеть незачем.
- Последняя строка модуля — return с тем, что он отдаёт
- require(путь) возвращает ровно это значение
- Модуль на сервере и модуль на клиенте — две независимые копии
- Циклический require двух модулей друг из друга приведёт к ошибке
Пример
Модуль с математикой награды и скрипт, который его использует.
local RewardMath = {}function RewardMath.forLevel(level: number): numberreturn math.max(0, level) * 10endfunction RewardMath.withBonus(amount: number, bonus: number): numberreturn math.floor(amount * (1 + bonus))endreturn RewardMath
Скрипт подключает его так: local RewardMath = require(ReplicatedStorage.RewardMath).
Задача
Сделай модуль с двумя функциями: одна переводит секунды в строку «мм:сс», другая проверяет, что число попадает в заданный диапазон.
- string.format("%02d:%02d", minutes, seconds) даст ведущие нули
- Не забудь вернуть таблицу в конце модуля
Показать решение
local Utils = {}function Utils.formatTime(seconds: number): stringlocal minutes = math.floor(seconds / 60)local rest = math.floor(seconds % 60)return string.format("%02d:%02d", minutes, rest)endfunction Utils.inRange(value: number, min: number, max: number): booleanreturn value >= min and value <= maxendreturn Utils
Проверь себя
Что должен сделать ModuleScript в последней строке?
Показать ответ
Без return модуль не отдаст ничего, и require вернёт nil.
Сколько раз выполняется код модуля при трёх вызовах require на одной стороне?
Показать ответ
Результат кэшируется: код модуля выполняется при первом require.