Как настроить Zenject, чтобы при запросе интерфейса он настраивал новый игровой объект и возвращал вновь связанный экземпляр класса

Zenject великолепен, но я не нашел подходящего решения для создания экземпляра игрового объекта

У меня есть скрипт, который предоставляет различные ловушки событий для монобихиологических событий. Start, PostStart, Update, FixedUpdate и другие, поэтому контроллеры, не относящиеся к Unity, могут запускаться при определенных событиях. Он основан на интерфейсе, который я назвал "IEventsController"

Мои настройки раньше были бы примерно такими:

private static IEventsController _Events;
public static IEventsController GetEvents()
{
    if (_Events == null) 
    {
        var go = new GameObject("EventsController");
        _Events = go.AddComponent<EventsController>();
    }

    return _Events;
}

Я пытаюсь выяснить, есть ли у Zenject встроенное решение для этого. Я мог бы использовать фабрику или метод, но фабрика имеет целый дополнительный класс для управления этим, когда Zenject может уже обработать это. Использование метода для генерации этого все еще требует статической ссылки, чтобы проверить, был ли он создан или нет, и это неправильно для этого, чтобы сидеть в сценарии установщика. Кроме того, существует ряд привязок FromComponent, в которых может быть что-то для этого, но я пока ничего не видел.

Пример вызова метода привязки, который я мог бы ожидать:

Container.BindComponent<IEventsController>()
   .To<EventsController>()
   .ViaNewGameObject("Events Controller");
  • Благодарю.

1 ответ

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

Если вы просто хотите создать объект, который не имеет зависимостей, то есть (не требует внедрения сам по себе), то:

Container.Bind<IEventsController>().FromMethod(...)

Если вы хотите создать объект, который имеет зависимости и требует внедрения, то создайте класс Factory:

Container.Bind<IEventsController>().FromFactory<EventsControllerFactory>()

class EventsControllerFactory : IFactory<IEventsController> {
    [Inject]
    public IDep1 dep1;

    public IEventsController Create() {
        return new EventsController(dep1);
    }
}

Если вы хотите создать GameObject, который также вводится, у вас есть несколько методов, которые позволяют вам выбрать, ознакомьтесь с методами FromComponentXXX, которые позволяют вам использовать префаб-ссылку или префаб, сохраненный в папке Resources, и несколько других.

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