Как стать автором
Обновить

Комментарии 14

Интересно посмотреть как спроектировать игру на уровне софта. Вот создал игрока, врагов и окружение. А как оно взаимодействует между собой? Конечно создаешь скрипты со здоровьем, атакой и другие, но как все это правильно связать если оно разрастется? Я начинающий программист, поэтому тяжело понять. Буду ждать примеров в следующей статье, спасибо!
MVC не самый удобный для геймдева паттерн/парадигма имхо, и тут надо мыслить не общим смыслом — здоровье, атака и тд, а тем как и где это будет храниться. Хранение данных происходит в модели(отдельный скрипт). Будет некая модель в которой будут атака, здоровье, скорость, и тд и тп. Когда это надо отрисовать например в UI. Создается отдельный скрипт View. Там всё про отрисовку. А общая логика и зависимости от другой логики пишутся в скрипте Controller. В итоге на одну сущность минимум три класса/файла.
А что порекомендуете? Может пример какой-нибудь есть с лучшими практиками? У меня вот на игрока навешаны несколько скриптов, а внешний мир ищет, например, скрипт здоровье игрока и пытается взаимодействовать с игроком: нанести урон, вызвать метод, собрать предмет.
я бы смотрел в сторону MVVM — попроще для понимания, меньше писанины, или ECS.
Хорошая статья. Только смутило название паттерна — Инверсия контроля.
это не паттерн, это один из принципов, habr.com/ru/post/131993 тут в комментах есть ссылки еще на статьи
MVC+MessageBus — это не почти ли тоже самое, что MVVM? Только последние, имхо, походит куда лучше и без лишних сущностей?

Все эти Message/Signal Bus это, конечно, замечательно decoupling, тестируемость и так далее по списку, но есть одно большое НО. Я поддерживал два проекта с подобной архитектурой и видел ещё несколько подобных. У них есть одна большая проблема, в них абсолютно невозможно разобраться (по крайней мере эта проблема была на всех проектах, с которыми я работал, возможно, кто-то готовит это лучше):


  • Cигналы летят чёрти куда и чёрти когда, слишком высокая когнитивная нагрузка на работу с таким кодом, особенно, если его писал не ты (тем кто это писал, конечно же, всё нравится)
  • Невозможно понять что нужно слушать/триггерить, документация далеко не всегда есть на проекте, опять же нужно идти и смотреть по коду. С интерфейсом для View, у которой есть понятный интерфейс с обычными событиями работать в разы проще.
  • Сигналы вообще ничего не гарантируют — не гарантирует, что View точно триггерит такой сигнал, не гарантирует что он значит то, что ты ждёшь.
  • Невозможно управлять порядком, в котором отрабатывают подписчики (если их несколько). В местах, где это необходимо приложение начинает обрастать костылями, что опять-таки увеличивает когнитивную нагрузку.
  • Разработчики слишком увлекаются сигналами и вместо того, чтобы вернуть какой-то результат триггерят сигнал (апофеоз такого подхода кода вида 'void Login()', а как получить результат — лезь в код и ищи сам)
  • Как продолжение двух предыдущих пунктов, возникают ситуации, когда код настолько завязываются на сигналы, что вся гибкость подхода испаряется.

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

alxgon176 а на что бы вы это заменили? Я вот заметил пытаюсь собрать игру снизу вверх, а думаю правильнее было бы сначала наметить блоки и как-то их связать между собой, а потом уже все остальное писать

Зависит от типа игры, этапа разработки и требований, на самом деле. Я бы сначала написал слой модели и сервисов, покрыл бы их тестами, а потом бы уже думал о том, через что связывать это всё с View (на схеме в статье предлагается не самое лучшее решение сделать анемичную модель и перенести бизнес логику в контроллер, я бы такого избегал). Откуда начинать писать модель не особо важно, можно взять какую-то понятную сущность, начать писать его логику, а всё остальное скрывать за абстракцией и мокать


Если волнует непосредственно отношение с view, то у нас в студиях есть два основных подхода: HMVC и ECS.

когда ивенты/месседжи — всегда тяжелее читать код, для меня лучшая практика это когда отдельный ивент представлен отдельным контейнером, чуть попроще разбираться кто с этим ивентом работает.

А вообще все подобные проблемы возникнут на любом более менее крупном проекте, который писали много программистов и в котором много сущностей. При любой парадигме. Всё равно надо будет сидеть и въезжать что откуда ).

Вопрос какой уровень въезжания нужен, даже код написанный на синглтонах разобрать проще, а в подходах, которые используются у нас в студиях разобраться ещё проще.

более ригидный код с сильными связями всегда легче читать чем более абстрактный код, связи которого не очевидны и реализовываются фреймворком ), это я про синглтоны, а воообще в целом я согласен что у архитектуры приложения одними из требований должны быть легкий вход/понятность и удобство. Кстати я еще не видел на боевом проекте активного использования Signal у Zenject, обычно Zenject используют как DI и всё. Но часто вижу самописные Event Bus.

Я видел один раз использование Zenject сигналов в одном проекте, если не смотреть на то, как он был использован, то у меня претензий нет, наверное если мне бы вдруг захотелось построить проект на базе сигналов, то я бы его и взял

Зарегистрируйтесь на Хабре, чтобы оставить комментарий