Урок 8 из 15

Модули: как перестать копировать код между скриптами

Выносить общий код в модуль и подключать его из разных скриптов.

Теория

ModuleScript сам по себе не выполняется. Он возвращает значение — почти всегда таблицу с функциями — и это значение получает тот, кто вызвал require.

Модуль выполняется один раз на сторону: первый require запускает его код, все следующие получают уже готовый результат. Поэтому в модуле удобно хранить общие настройки и состояние.

Лежат модули обычно в ReplicatedStorage, если нужны обеим сторонам, и в ServerScriptService, если это серверная логика, которую клиенту видеть незачем.

  • Последняя строка модуля — return с тем, что он отдаёт
  • require(путь) возвращает ровно это значение
  • Модуль на сервере и модуль на клиенте — две независимые копии
  • Циклический require двух модулей друг из друга приведёт к ошибке

Пример

Модуль с математикой награды и скрипт, который его использует.

ReplicatedStorage/RewardMath.lua
  1. local RewardMath = {}
  2.  
  3. function RewardMath.forLevel(level: number): number
  4. return math.max(0, level) * 10
  5. end
  6.  
  7. function RewardMath.withBonus(amount: number, bonus: number): number
  8. return math.floor(amount * (1 + bonus))
  9. end
  10.  
  11. return RewardMath

Скрипт подключает его так: local RewardMath = require(ReplicatedStorage.RewardMath).

Задача

Сделай модуль с двумя функциями: одна переводит секунды в строку «мм:сс», другая проверяет, что число попадает в заданный диапазон.

  • string.format("%02d:%02d", minutes, seconds) даст ведущие нули
  • Не забудь вернуть таблицу в конце модуля
Показать решение
ReplicatedStorage/Utils.lua
  1. local Utils = {}
  2.  
  3. function Utils.formatTime(seconds: number): string
  4. local minutes = math.floor(seconds / 60)
  5. local rest = math.floor(seconds % 60)
  6.  
  7. return string.format("%02d:%02d", minutes, rest)
  8. end
  9.  
  10. function Utils.inRange(value: number, min: number, max: number): boolean
  11. return value >= min and value <= max
  12. end
  13.  
  14. return Utils

Проверь себя

Что должен сделать ModuleScript в последней строке?

Показать ответ

Без return модуль не отдаст ничего, и require вернёт nil.

Сколько раз выполняется код модуля при трёх вызовах require на одной стороне?

Показать ответ

Результат кэшируется: код модуля выполняется при первом require.