ZENJECT ⚡️ Dependency injection в Unity

Zenject — контейнер внедрения зависимостей с открытым исходным кодом, нацеленный на применение с игровым движком Unity3D, обеспечивающий работу на большинстве платформ, поддерживаемых Unity3D. Стоит заметить, что Zenject можно применять и для С# приложений, разработанных без Unity3D. Этот контейнер является довольно популярным среди Unity разработчиков, активно поддерживается и развивается. Кроме того, Zenject обладает всем необходимым контейнеру DI функционалом.

Статья тут https://habr.com/ru/post/420235/

В этом видео

  • DI в Unity, Zenject, холивары, перегруженность
  • Что такое Zenject и требуют ли его в вакансиях
  • Использовать ли DI в играх?
  • Демка, Unity Learn и наши задачи здесь
  • Что такое DI, явные и неявные зависимости
  • Устройство и жизненный цикл Zenject, устанавливаем Extenject
  • Script Execution Order
  • Создаем BootstrapInstaller
  • Создаем SceneContext
  • Убираем героя со сцены и инстанцируем из кода, решаем зависимости
  • Ответ: Что если для инстанцирования используется другой framework, например, Photon?
  • Разница между AsSingle, AsTransient, AsCached, проблемы singletone
  • Чем плоха инжекция в методы, как организовать инжекцию в MonoBehaviour, как быть без конструктора
  • Можно ли инжектить зависимости в поля?
  • Пробрасываем зависимости со сцены
  • Добавляем сервис
  • Саммари
  • Не становятся ли контексты god-обджектами?
  • Что за курс?
  • Какой должен быть уровень знаний у поступающего на курс?
  • Фабрики, начало, задача
  • Как называть классы, если не Manager и Controller?
  • Фабрики: продолжение, как задавать баланс на уровне
  • Использование Gizmo на сцене
  • Как бороться с проблемой, когда становится важным поярдок Bind в инсталлерах?
  • Фабрики: продолжение, префабы, EnemyFactory
  • IInitializable
  • Преимущество маленьких методов
  • Как переходить на Zenject в большом легаси проекте
  • Как вы относитесь к архитектуре на ивентах через ScriptableObject?

If you want to instantiate your prefab in scene without fields (links), you need to suck some dick :

  1. Create file InstallBindings
using Zenject;

public class InstallBindingsLvl : MonoInstaller
{
    public override void InstallBindings()
    {
        LevelStatisticHandler();
    }

    private void LevelStatisticHandler()
    {
        Container.Bind<LevelStatisticHandler>().FromComponentInNewPrefabResource("LevelStatisticHandlerPrefab").AsSingle().NonLazy();
    }
}


where «LevelStatisticHandlerPrefab» — the path to your prefab. (Asset/Resources/LevelStatisticHandlerPrefab)

2. Create empty gameobject in your scene and add script «SceneContext».

2.1. Then add to this gameobject your «InstallBindings» script.

2.2. Make link from your InstallBindings to «SceneContext» script in line «MonoInstallers»

as a result like this.

This script must being on the scene

if you want to insert to your prefab some arguments, insert in your installBindings script this method

...
 [SerializeField] private Transform playerParent;
...

private void PlayerInstaller()
    {
        Container.Bind<PlayerComponent>().FromComponentInNewPrefabResource("PlayerPrefab").AsSingle().WithArguments(playerParent);
    }

and in your PlayerComponent add this

[Inject]
    private void Construct(Transform parent)
    {       
        transform.parent = parent;        
    }

I have more info about this, but i don’t suredo you need this or not. Leave a comment, if you want to know more!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *