НИ+ ngplus.games

Компонентная архитектура - композиция против наследования

188 слов no tags

Компонент - атомизированное игровое поведение, Game Behavior (GB).

Сумма компонентов на Игровой Сущности составляет Игровую Механику, Game Mechanic (GM).

Компонент объектен - содержит данные и логику. Выполняет только одну задачу.

Чтобы компоненты могли работать сообща, они передают данные между собой с помощью событий с аргументами.

Компонент более низкого уровня подписывается на компонент более высокого уровня через интерфейс.

Проблема в том, что один компонент может (хочется) триггериться от разных событий исходящих от разных других компонентов.

Либо надо писать одну и ту же логику для разных триггеров: УмерОтПопадания, УмерОтВремени, УмерОтКринжа; либо жирно обмазывать компоненты-триггеры интерфейсами типа IDestroyable, через который на них сможет подписываться один-единственный УмерОтЧего-то.

Но и это не решает проблему, потому что на объекте может быть несколько компонентов, которые могут имплементировать IDestroyable.

Все это сильно мешает единственно правильному подходу к дизайну - ортогональному.

Либо нужна система, которая позволит выстраивать последовательности поведений - что не звучит реалистично, либо агрегировать их все в одном объектно-специфичном скрипте - что звучит реалистично.

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