Представь, что ты собираешь конструктор LEGO. У тебя есть куча деталей, но чтобы построить крутой замок, ты хочешь использовать готовые наборы, например, башню или мост, которые уже кто-то сделал. Эти наборы — как модули в программировании. Модуль — это кусочек кода, который делает что-то полезное (например, рисует персонажа или считает очки) и который можно использовать в разных местах.
А теперь представь, что у тебя есть волшебное слово — require. Когда ты говоришь require(“башня”), игра Defold приносит тебе готовую башню из файла с кодом, и ты можешь её использовать в своём замке. Без этого слова ты бы сам каждый раз строил башню с нуля, а так — просто берёшь готовое!
Пример: у тебя есть файл игрок.lua, где написано, как прыгать. Ты пишешь в другом файле require(“игрок”), и теперь можешь сказать: “Прыгай!” — и код из того файла сработает. Это как взять готовую игрушку и играть с ней!
Что такое модуль?
Модуль — это файл, содержащий код, который можно использовать в других частях проекта. Модуль обычно создаётся как локальная таблица (например, M
), в которую добавляются функции, переменные или другие данные. Они могут быть доступны внешнему коду. Таблица, внутренние переменные и вспомогательные функции должны быть объявлены с ключевым словом local
, чтобы избежать утечек в глобальную область.
В Defold файл модуля имеет расширение lua, как пример:
Модуль можно создать в контекстном меню:
Что такое require?
require
— это встроенная функция языка Lua, которая используется для подключения и загрузки Lua-модулей в ваш проект. Она позволяет организовать код модульно, разделяя его на отдельные файлы для повторного использования и упрощения управления.
Как включить модуль в свой файл:
local module = require("path.to.module")
path.to.module
— это путь к файлу модуля относительно структуры проекта Defold, где точки (“.
”) обозначают вложенные папки, а имя файла указывается без расширения .lua
.
Что возвращает модуль?
Модуль должен возвращать значение (обычно таблицу), которое будет доступно через переменную, в которую вы сохраняете результат require
.
Например, у нас имеется модуль — arithmetic.lua
.
Его содержимое:
local M = {}
function M.add(a, b)
return a + b
end
function M.sub(a, b)
return a - b
end
return M
Используем модуль arithmetic.lua
в lua-скрипте:
-- modules — папка, в которой находится модуль arithmetic.lua
-- точка "." — разделитель, указывающий на иерархию файлов в проекте
-- arithmetic — модуль arithmetic.lua
local arithmetic= require("modules.arithmetic")
print(arithmetic.add(2, 2)) -- Выведет 4
Ещё один пример, но уже с использованием Defold-функций в отдельном модуле.
Имеется модуль random.lua
, который содержит в себе функцию set_random_position
, которая устанавливает переданному ей игровому объекту случайную позицию.
local M = {}
function M.set_random_position(g_obj)
local pos = vmath.vector3(math.random(100, 700), math.random(100, 500), 0)
go.set_position(pos, g_obj) -- Устанавливаем позицию напрямую
end
return M
В скрипте level.script
содержится такой код:
local random = require("main.random")
math.randomseed(os.time())
function init(self)
random.set_random_position("/go") -- Просто вызываем функцию
end
Во время инициализации скрипта вызывается функция set_random_position
модуля random.lua
, которая устанавливает случайное значение игровому объекту go
.
Результат программы:
Мы также можем вызвать функцию из модуля для другого игрового объекта:
local random = require("main.random")
math.randomseed(os.time())
function init(self)
random.set_random_position("/go") -- Просто вызываем функцию
random.set_random_position("/go1") -- Вызываем функцию для второго объекта
end
Благодарю за внимание
Надеюсь, это руководство помогло вам разобраться с такими вопросами: что такое модуль, как его подключать к файлу и зачем он нужен. Если остались вопросы по теме, пишите — мы поможем найти на них ответы!