Хотя я научился и преподавал MVC и подобные подходы, я нахожу, что при разработке игровых архитектур обычно должно быть немного более гибким. В единстве я обычно принимаю следующий подход.
Я создам несколько GameObjects для хранения необходимой глобальной логики. Это будут такие вещи, как всеобъемлющая государственная машина, сетевое взаимодействие и иногда контроль ввода. Если что-то должно сохраниться между сценами, оно пойдет здесь. Каждый объект обычно имеет один компонентный скрипт для игровой логики и один для временных/отладочных функций, которые отключаются или удаляются, когда они не нужны.
Если у проекта есть фиксированные уровни, я сделаю каждый уровень сценой, и я сохраню макет уровня и другую информацию о конкретном уровне в сцене. Если я выполняю более процедурный проект, я создам объект «LevelGenerator» со сценариями компонентов, которые собирают и заполняют уровень во время выполнения.
Если я создаю систему, в которой есть много преимущественно независимых агентов (, например, например, вражеских существ) Я стараюсь поддерживать логику игры и необходимую информацию о состоянии для каждого агента, как можно ближе к ней в иерархии. Например, положение и вращение агента будут сохранены в его преобразовании. Я могу хранить агенты, здоровье, боеприпасы, скорость и текущие статусные эффекты, а также функции перемещения, стрельбы, исцеления и смерти в сценарии компонентов в GameObject агента.
Хотя существует бесчисленное множество других подходов, которые могли бы работать, мне нравится этот подход к нескольким причинам:
- Это избавляет меня от необходимости вручную управлять тонн доступа к данным в центральном сценарии. Если мне нужно знать, где все монстры, я могу просто сохранить список игровых объектов, а не использовать пользовательские типы данных.
- Когда агент уничтожается, все локальные данные идут вместе с ним. (Нет сложных функций для очистки мертвых агентов.)
- С точки зрения игровой логики (на проектах, которые я обычно работаю) обычно имеет смысл, что каждый агент будет «знать» о себе, а не о всех остальных.
- Я по-прежнему могу использовать все полезные свойства, такие как полиморфизм и т. Д., Когда это необходимо.
Этот ответ скорее всего говорит о том, как я подхожу к дизайну игр и архитектуре программного обеспечения, чем общие рекомендации, но это может быть полезно.
Одно примечание об инкапсуляции в единстве. Каждый скрипт компонента, который вы добавляете к игровому объекту, имеет немного накладных расходов. Если в вашей сцене есть несколько десятков агентов, то это не очень важно, и я бы рекомендовал стараться как можно более OO и модульно. Если вы создаете систему с сотнями или тысячами активных агентов, сокращение компонентов на одного агента от двух до одного может означать довольно много времени сохраненного кадра.
Не стесняйтесь на самом деле сообщить нам, что вы намереваетесь построить. «2D-проект» слишком расплывчатый, и похоже, что вы хотите, чтобы мы слишком много думали о вас. –
Я не хотел, чтобы вы думали. Я создаю платформерную игру, чтобы быть конкретным, но я думаю, что мой вопрос не связан с каким-либо конкретным типом игры (конечно, не говоря уже о больших проектах). Единственное, что я хотел, это услышать от других пользователей, как они управляют разделением кода в своих проектах, и я разместил свое решение, поэтому я не понимаю, как я могу быть обвинен в невнимании –
MyFantasy512
Если ответ помогает вам, подумайте о том, чтобы выжить и принять его. – user3071284