Commission: Mad Scientist by Culpeo-Fox on DeviantArt
В этой статье я примерно опишу паттерн ECS, и свою реализацию в Flame Steel Engine Game Toolkit. Паттерн Entity Component System (Сущность, Компонент, Система) используется в играх, в т.ч. на движке Unity. Каждый объект в игре представляет из себя Сущность, которая заполнена Компонентами. Зачем это нужно если есть ООП?
Затем чтобы менять свойства, поведение, отображение объектов прямо во время выполнения игры. Такие вещи не встречаются в прикладных приложениях реального мира, динамика изменения параметров, свойств объектов, отображения, звучания, присущи больше играм, чем бухгалтерскому ПО.
Бананы мы не проходили
Допустим у нас в игре есть класс банан. И геймдизайнер захотел чтобы бананы можно было использовать как оружие. Допустим в текущей архитектуре бананы никак не связаны с оружием. Делать банан оружием? Делать все предметы оружием?
ECS предлагает решение данной насущной проблемы – все объекты в игре должны состоять из компонентов. Раньше банан был классом Banana, теперь мы сделаем его, и все остальные объекты, классом Entity (Сущность), добавим им компоненты. Допустим банан теперь состоит из компонентов:
- Компонент позиции (координаты в игровом мире – x, y, z)
- Компонент поворота (координаты x, y, z)
- Компонент калорийности банана (главному герою нельзя сильно толстеть)
- Компонент картинки банана
Теперь мы добавляем для всех бананов новый компонент, который является флагом того что его можно использовать как оружие – Компонент оружия. Теперь когда игровая Система видит что игрок подошел к банану, она проверяет наличие компонента оружия у банана, и если он есть, то вооружает игрока бананом.
В моей игре Flame Steel Call Of The Death Mask, паттерн ECS используется везде. Объекты состоят из компонентов, компоненты сами могут содержать компоненты. Вообще разделение объект < – > компонент в моей реализации отсутствует, но это даже плюс.
Дробовик на данном скриншоте является компонентом игрока и в то же время второй дробовик просто висит на игровой карте как обычный объект.
На данном скриншоте работают две Системы – отрисовщик сцены и отрисовщик интерфейса. Отрисовщик сцены работает с компонентом изображения дробовика на карте, отрисовщик интерфейса с компонентом изображения дробовика в руках игрока.
Ссылки по теме:
https://habrahabr.ru/post/197920/
https://www.youtube.com/watch?v=NTWSeQtHZ9M