mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-04 10:31:50 +00:00
119 lines
6.9 KiB
Markdown
119 lines
6.9 KiB
Markdown
# Скриптинг
|
||
|
||
В качестве языка сценариев используется LuaJIT
|
||
|
||
Подразделы:
|
||
- [События движка](scripting/events.md)
|
||
- [Пользовательский ввод](scripting/user-input.md)
|
||
- [Файловая система и сериализация](scripting/filesystem.md)
|
||
- [Свойства и методы UI элементов](scripting/ui.md)
|
||
- [Сущности и компоненты](scripting/ecs.md)
|
||
- [Библиотеки](#)
|
||
- [app](scripting/builtins/libapp.md)
|
||
- [assets](scripting/builtins/libassets.md)
|
||
- [base64](scripting/builtins/libbase64.md)
|
||
- [bjson, json, toml, yaml](scripting/filesystem.md)
|
||
- [block](scripting/builtins/libblock.md)
|
||
- [byteutil](scripting/builtins/libbyteutil.md)
|
||
- [crypto](scripting/builtins/libcrypto.md)
|
||
- [cameras](scripting/builtins/libcameras.md)
|
||
- [ctypes](scripting/builtins/libctypes.md)
|
||
- [entities](scripting/builtins/libentities.md)
|
||
- [file](scripting/builtins/libfile.md)
|
||
- [gfx.blockwraps](scripting/builtins/libgfx-blockwraps.md)
|
||
- [gfx.particles](particles.md#библиотека-gfxparticles)
|
||
- [gfx.posteffects](scripting/builtins/libgfx-posteffects.md)
|
||
- [gfx.skeletons](scripting/builtins/libgfx-skeletons.md)
|
||
- [gfx.text3d](3d-text.md#библиотека-gfxtext3d)
|
||
- [gfx.weather](scripting/builtins/libgfx-weather.md)
|
||
- [gui](scripting/builtins/libgui.md)
|
||
- [hud](scripting/builtins/libhud.md)
|
||
- [input](scripting/builtins/libinput.md)
|
||
- [inventory](scripting/builtins/libinventory.md)
|
||
- [item](scripting/builtins/libitem.md)
|
||
- [mat4](scripting/builtins/libmat4.md)
|
||
- [network](scripting/builtins/libnetwork.md)
|
||
- [pack](scripting/builtins/libpack.md)
|
||
- [pathfinding](scripting/builtins/libpathfinding.md)
|
||
- [player](scripting/builtins/libplayer.md)
|
||
- [quat](scripting/builtins/libquat.md)
|
||
- [random](scripting/builtins/librandom.md)
|
||
- [rules](scripting/builtins/librules.md)
|
||
- [session](scripting/builtins/libsession.md)
|
||
- [time](scripting/builtins/libtime.md)
|
||
- [utf8](scripting/builtins/libutf8.md)
|
||
- [vec2, vec3, vec4](scripting/builtins/libvecn.md)
|
||
- [world](scripting/builtins/libworld.md)
|
||
- [Расширения стандартных библиотек](scripting/extensions.md)
|
||
- [Модуль core:bit_converter](scripting/modules/core_bit_converter.md)
|
||
- [Модуль core:data_buffer](scripting/modules/core_data_buffer.md)
|
||
- [Модули core:vector2, core:vector3](scripting/modules/core_vector2_vector3.md)
|
||
- [Встроенные компоненты сущностей](scripting/core_components.md)
|
||
|
||
## Аннотации типов данных
|
||
|
||
В документации к Lua библиотекам используются аннотации типов,
|
||
не являющиеся частью синтаксиса Lua.
|
||
|
||
- vector - массив из трех или четырех чисел
|
||
- vec2 - массив из двух чисел
|
||
- vec3 - массив из трех чисел
|
||
- vec4 - массив из четырех чисел
|
||
- quat - массив из четырех чисел - кватернион
|
||
- matrix - массив из 16 чисел - матрица
|
||
|
||
## Пространства имён
|
||
|
||
В настоящее время, движок использует иерархию пространств имён, минимизирующую конфликты между отдельными модулями, скриптами, да и паками.
|
||
|
||
Актуальна следующая структура:
|
||
|
||
- Глобальное пространство (оно же - _G), являющееся корневым, запись в которое, вне модулей ядра движка, является крайне нежелательным для вашего же времени, что может уйти на лишние часы отладки.
|
||
- Пространство пака - создаётся каждый раз при загрузке контента для каждого, включённого в конфигурацию, пака. Это пространство используют модули, а также скрипты предметов и блоков.
|
||
- Пространство [компонента](scripting/ecs.md#пользовательские-компоненты).
|
||
- Пространство [UI-документа](scripting/ui.md)
|
||
- Изолированное пространство имён генератора мира.
|
||
|
||
## Модули
|
||
|
||
Модуль - глобальный объект со сроком жизни, ограниченным сроком жизни контента, используемый как для взаимодействия разных паков, так и для вместо глобальных переменных в пределах самого пака.
|
||
|
||
Модуль должен находиться в `контентпак/modules/**` (допускаются вложенные папки, что нужно будет указывать)
|
||
|
||
```lua
|
||
local имя_модуля = require "контентпак:имя_модуля" -- импортирует модуль
|
||
|
||
-- если модуль находится в том же паке, в котором импортируется, можно использовать сокращённый вариант:
|
||
local имя_модуля = require "имя_модуля"
|
||
|
||
-- при использовании вложенных папок:
|
||
local имя_модуля = require "контентпак:путь/к/имя_модуля" -- путь не включает `modules`
|
||
local имя_модуля = require "путь/к/имя_модуля" -- если в том же паке
|
||
```
|
||
|
||
Модуль будет иметь пространство имён того пака, в котором находится, независимо от пространства имён, из которого был выполнен первый импорт.
|
||
|
||
При создании модуля следует придерживаться следующего подхода, которого и ожидает *require*:
|
||
|
||
```lua
|
||
local this = {
|
||
имя_переменной = ... -- публичные переменные
|
||
}
|
||
|
||
-- приватные переменные модуля
|
||
local имя_переменной = ...
|
||
|
||
-- приватные функции модуля
|
||
local function имя_функции(...)
|
||
...
|
||
end
|
||
|
||
-- публичные функции модуля
|
||
function this.имя_функции(...)
|
||
...
|
||
end
|
||
|
||
return this -- результат, который и будет возвращать и кешировать require
|
||
```
|
||
|
||
При повторном импорте модуль не будет перезагружен - вместо этого require вернёт кешированный результат.
|