Скриптинг на основе компонентов
Проектируйте игровые сущности как таблицы с компонентами поведения в Lua.
«Скриптинг на основе компонентов» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое компонентное проектирование
Вместо глубоких иерархий классов сущности состоят из компонентов — небольших специализированных таблиц с данными и поведением. Сущность представляет собой просто набор компонентов.
Сущность как таблица
Сущность — это таблица с полями id и вложенной таблицей components. Компоненты добавляются и удаляются во время выполнения программы.
local function newEntity(id)
return {id = id, components = {}}
end
local player = newEntity(1)Добавление компонентов
Присоедините компонент, установив именованный ключ в таблице компонентов.
player.components.position = {x=0, y=0}
player.components.health = {hp=100, max=100}
player.components.sprite = {image="player.png", scale=1}Системы обрабатывают компоненты
Система обрабатывает все сущности, у которых есть необходимый набор компонентов. Системы перебирают сущности и обновляют данные компонентов.
local function moveSystem(entities, dt)
for _, e in ipairs(entities) do
local pos = e.components.position
local vel = e.components.velocity
if pos and vel then
pos.x = pos.x + vel.dx * dt
pos.y = pos.y + vel.dy * dt
end
end
endСкрипты компонентов
Присоединяйте функции Lua в качестве поведения компонентов — это простой способ добавить каждой сущности собственную логику.
player.components.ai = {
update = function(self, entity, dt)
-- move towards target
end
}Реестр компонентов
Реестр сопоставляет имена типов компонентов с фабричными функциями, благодаря чему компоненты можно создавать по имени, например из файла уровня.
local registry = {}
function registry.register(name, factory)
registry[name] = factory
end
function registry.create(name, ...)
return registry[name](...)
endУдаление компонентов
Присвойте компоненту значение nil, чтобы удалить его. После этого системы, которым он требуется, будут игнорировать сущность.
player.components.health = nil -- entity is "dead"Мир и менеджер сущностей
Объект World хранит все сущности и системы, перебирает системы на каждом такте и предоставляет API для запросов сущностей.
Запрос сущностей по компонентам
Предоставьте функцию запроса, которая возвращает все сущности, содержащие все указанные компоненты.
local function query(world, ...)
local required = {...}
local result = {}
for _, e in ipairs(world.entities) do
local ok = true
for _, comp in ipairs(required) do
if not e.components[comp] then ok = false; break end
end
if ok then result[#result+1] = e end
end
return result
endПрототипы
Прототип — это шаблонная таблица компонентов. Создавайте новые сущности из прототипов, выполняя глубокое копирование шаблона.
Преимущества перед наследованием
- Нет глубоких иерархий.
- Поведение комбинируется во время выполнения.
- Функции легко добавлять и удалять.
- Данные управляются файлами конфигурации.
Вопрос о проектировании компонентов
Что делает система в компонентном проектировании?
Итоги: компонентное программирование
Сущности представляют собой таблицы компонентов. Системы обрабатывают сущности с необходимыми компонентами. Такая слабо связанная архитектура, управляемая данными, гибче глубоких иерархий наследования и естественно реализуется в Lua.
Часто задаваемые вопросы
Урок «Скриптинг на основе компонентов» бесплатный?
Да — полный текст урока «Скриптинг на основе компонентов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Скриптинг на основе компонентов»?
Проектируйте игровые сущности как таблицы с компонентами поведения в Lua. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Скриптинг на основе компонентов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Системы событий в Lua
- Скриптинг на основе компонентов
- Поведение искусственного интеллекта с помощью автоматов состояний
- Конфигурация на основе данных и горячая перезагрузка