Что такое модуль, что такое require в Defold

Представь, что ты собираешь конструктор LEGO. У тебя есть куча деталей, но чтобы построить крутой замок, ты хочешь использовать готовые наборы, например, башню или мост, которые уже кто-то сделал. Эти наборы — как модули в программировании. Модуль — это кусочек кода, который делает что-то полезное (например, рисует персонажа или считает очки) и который можно использовать в разных местах.

А теперь представь, что у тебя есть волшебное слово — require. Когда ты говоришь require(“башня”), игра Defold приносит тебе готовую башню из файла с кодом, и ты можешь её использовать в своём замке. Без этого слова ты бы сам каждый раз строил башню с нуля, а так — просто берёшь готовое!

Пример: у тебя есть файл игрок.lua, где написано, как прыгать. Ты пишешь в другом файле require(“игрок”), и теперь можешь сказать: “Прыгай!” — и код из того файла сработает. Это как взять готовую игрушку и играть с ней!

Что такое модуль?

Модуль — это файл, содержащий код, который можно использовать в других частях проекта. Модуль обычно создаётся как локальная таблица (например, M), в которую добавляются функции, переменные или другие данные. Они могут быть доступны внешнему коду. Таблица, внутренние переменные и вспомогательные функции должны быть объявлены с ключевым словом local, чтобы избежать утечек в глобальную область.

В Defold файл модуля имеет расширение lua, как пример:
image
Модуль можно создать в контекстном меню:

Что такое 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.

Результат программы:
Modules

Мы также можем вызвать функцию из модуля для другого игрового объекта:

local random = require("main.random")

math.randomseed(os.time())

function init(self)
	random.set_random_position("/go") -- Просто вызываем функцию
	random.set_random_position("/go1") -- Вызываем функцию для второго объекта
end

defolders

Благодарю за внимание

Надеюсь, это руководство помогло вам разобраться с такими вопросами: что такое модуль, как его подключать к файлу и зачем он нужен. Если остались вопросы по теме, пишите — мы поможем найти на них ответы!

2 лайка

Очень полезная статья. Узнал про модули благодаря тебе.

1 лайк