0Pricing
Lua Academy · Урок

Скриптинг на основе компонентов

Проектируйте игровые сущности как таблицы с компонентами поведения в 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 — локальная установка не требуется.

Все уроки этого курса

  1. Системы событий в Lua
  2. Скриптинг на основе компонентов
  3. Поведение искусственного интеллекта с помощью автоматов состояний
  4. Конфигурация на основе данных и горячая перезагрузка
← Назад к Lua Academy