Comments 8
Все таки ECS делает всю игровую логику в несколько раз сложней для понимания
Почему? Наоборот, все становится куда проще благодаря слабой связанности и модульности.
Как раз благодаря слабой связности непонятно, что происходит. Плюс ECS всегда создает большое количество бойлерплейт кода.
Что именно непонятно? По-моему, все просто. Весь список систем, выполняющихся друг за другом, можно просмотреть в стартап-классе Game. Они друг о друге не знают, коммуникация между разными частями проекта происходит через данные в компонентах и сущности. Как раз эта слабая связанность дает модульность и в итоге легче рефакторить код, изменяя или добавляя новые механики. Также проще смешивать разное поведение с помощью разных наборов компонентов. События тоже проще обрабатывать – просто создаешь сущность с нужным компонентом и ловишь в системе. Сами системы можно легко разделить на несколько или наоборот объединить.
Все, что плохо ложится на ECS (иерархические структуры, например), можно реализовать через сервисы и инжектнуть в системы.
Насчет бойлерплейта - зависит от фреймворка. В LeoECS Lite с расширениями не так уж и много.
ECS навязывает очень определенный подход к архитектуре, который подходит к некоторым видам игр вроде RTS, но плохо подходит ко всему остальному.
Вот про иерархические структуры например хорошо сказано, а они в более-менее крупной игре составляют большую часть игровой логики.
То что подсистемы друг о друге не знают, это не так уж и хорошо, потому что придется продумывать комплексную логику их взаимодействия, чтобы это потом не развалилось.
Ну да, в теории на простых примерах можно легко добавлять и удалять разные подсистемы, но в реальной разработке все опять окажется завязано друг на друга, только теперь еще с неявной логикой взаимодействия.
На мой взгляд ECS подход можно использовать только в целях оптимизации и только для некоторых критичных подсистем, а не для всей логики.
"ECS навязывает очень определенный подход к архитектуре, который подходит к некоторым видам игр вроде RTS, но плохо подходит ко всему остальному." - по моему мнению, он нормально подходит к совершенно разным проектам, у меня есть опыт использования ECS с разными играми: и с гк, и с шутерами, и с ртс, и с данжн кроулерами. В крупных проектах по типу Overwatch, Minecraft и, насколько я знаю, в играх от Larian тоже используют этот подход для игровой логики, а это не RTS игры.
Pathfinding, ИИ через граф (FSM/BT/DT/GOAP/etc), UI и другие иерархии - это все можно реализовать отдельными сервисами с нужным API и использовать его внутри систем.
Не совсем понимаю, что имеется в виду под комплексной логикой взаимодействия. Ничего не развалится, если правильно называть компоненты и не допускать логических ошибок. А то, что могут быть баги... ну, баги везде могут быть, что с ECS, что без. В любом случае он дает хорошую модульность и возможность проще писать игровую логику.
Всё отлично, но возможно всё таки стоило подекомпозить логику в отдельные методы, для улучшения читаемости, фигачить всё в Run или Update такое себе.
Создание dungeon crawler'а с LeoECS Lite. Часть 2