Бог объект или где хранить ссылки на подсистемы

У меня есть много подсистем моей игры. Они могут использовать друг друга. Ранее я инициализировал и сохранял ссылки на подсистемы в статическом объекте Game вместо создания синглтона. Теперь я вижу, что Game имеет слишком много ссылок на другие классы и выглядит запутанно:

public static PlayerSettings PlayerSettings { get { return _playerSettings; } }

public static CommunityClient Community { get; private set; }
public static DatabaseConnectionWrapper Database { get; set; }
public static LoginConnectionWrapper LoginProtocolConnection { get; set; }
public static WorldEmulatorConnection WorldEmulatorConnection { get; set; }
public static WorldPlayerConnection WorldPlayerConnection { get; set; }
public static WorldConnection WorldConnection { get { return IsEmulatorMode ? (WorldConnection)WorldEmulatorConnection : WorldPlayerConnection; } }

public static MusicManager MusicManager { get; private set; }
public static SkyboxManager SkyboxManager { get; private set; }

public static VKInfo VK { get; private set; }

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


ADDED
Глядя на DI - я могу отправить зависимости конструктору класса и инициализировать каждый класс в статической фабрике. Это то, что я ищу.
Но я только что понял, что моя проблема в том, что когда я пытаюсь использовать объектно-компонентную архитектуру Unity3D, я не могу отправить зависимости конструктору, потому что инициализация класса вызывается из UnityEngine.
Так что в этом случае мне нужны Singleton или Blob для хранения ссылок. если я выкину архитектуру Unity, тогда я получу все зависимости от конструктора, и никакие синглтоны или капли не нужны.
Мне нужно переделать мою архитектуру, чтобы UnityEngine не создавал объекты, которые должны получать ссылки на подсистемы, а создавал эти классы из моего кода и позволял им создавать и управлять своими "объектами" UnityEngine.

2 ответа

Решение

Глядя на DI - я могу отправить зависимости конструктору класса и инициализировать каждый класс в статической фабрике. Это то, что я ищу. Но я только что понял, что моя проблема в том, что когда я пытаюсь использовать объектно-компонентную архитектуру Unity3D, я не могу отправить зависимости конструктору, потому что инициализация класса вызывается из UnityEngine. Так что в этом случае мне нужны Singleton или Blob для хранения ссылок. если я выкину архитектуру Unity, тогда я получу все зависимости от конструктора, и никакие синглтоны или капли не нужны. Мне нужно переделать мою архитектуру, чтобы UnityEngine не создавал объекты, которые должны получать ссылки на подсистемы, а создавал эти классы из моего кода и позволял им создавать и управлять своими "объектами" UnityEngine.

Я думаю, ты слишком усложняешься, Влад.

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

Если у вас есть объекты менеджера, которые действительно должны иметь MonoBehaviour, то эти ссылки можно получить из загруженной сцены с помощью простого события OnLevelLoaded или чего-то, что вы сами вызовете из любого объекта, который фактически вызовет загрузку сцены. Как только ваше событие будет запущено, используйте метод FindObjectOfType, предоставленный Unity api, чтобы найти ваши GameObjects со сцены.

Таким образом, в конце дня один одноэлементный класс, также известный как ваш объект God, будет отслеживать все ваши подсистемы, все привязанные сцены будут собраны из загруженной сцены с помощью простого вызова API.

Это все, что нужно сделать. Это может показаться сложным, но это не так.

Другие вопросы по тегам