1

我有一系列预制件,我希望能够通过 Zenject Factory 实例化随机挑选的预制件,并在它们的子容器中执行它们的绑定。

我想要做的与 Zenject 文档中的代码示例相同,但用于随机选择的预制件。 https://github.com/modesttree/Zenject/blob/master/Documentation/SubContainers.md#using-game-object-contexts-no-monobehaviours

using UnityEngine;
using Zenject;

public class GameInstaller : MonoInstaller
{
    [SerializeField]
    GameObject ShipPrefab;

    public override void InstallBindings()
    {
        Container.BindInterfacesTo<GameRunner>().AsSingle();

        Container.BindFactory<float, ShipFacade, ShipFacade.Factory>()
            .FromSubContainerResolve().ByNewPrefabInstaller<ShipInstaller>(ShipPrefab);
    }
}

我能够部分使它与

[SerializeField] private GameObject[] ships;

...

Container.BindFactory<float, ShipFacade, ShipFacade.Factory>()
            .FromSubContainerResolve().ByNewGameObjectMethod(SpawnShip);

...

private void SpawnShip(DiContainer container, float speed)
{
    container.Bind<ShipFacade>().AsSingle();
    container.Bind<Transform>().FromComponentOnRoot();
    var shipPrefab = ships[Random.Range(0, ships.Length)];
    var ship = container.InstantiatePrefab(shipPrefab);
    container.Bind<ShipHealthHandler>().FromNewComponentOn(ship).WhenInjectedInto<ShipFacade>();
    container.BindInstance(speed).WhenInjectedInto<ShipInputHandler>();
}

但这很尴尬,在这种情况下,我想我没有使用子容器的优势。并且预制件也会在一个空的 GameObject 中生成。我想要实现的是能够使用 ShipInstaller 进行子容器绑定。

4

1 回答 1

1

你是对的,没有一种非常优雅的方式来动态选择子容器预制件。

今天我花了一些时间通过这个提交来改进它。如果您使用最新版本的Extenject ,那么您现在可以执行以下操作:

public class QuxInstaller : Installer {
    float _speed;

    public QuxInstaller(float speed) {
        _speed = speed;
    }

    public override void InstallBindings() {
        Container.BindInstance(_speed);
        Container.Bind<QuxFacade>().AsSingle();
    }
}

public class CubeInstaller : MonoInstaller
{
    public List<GameObject> QuxPrefabs;

    public override void InstallBindings()
    {
        Container.BindFactory<float, QuxFacade, QuxFacade.Factory>()
            .FromSubContainerResolve().ByNewPrefabInstaller<QuxInstaller>(ChooseQuxPrefab);
    }

    UnityEngine.Object ChooseQuxPrefab(InjectContext _) {
        return QuxPrefabs[Random.Range(0, QuxPrefabs.Count)];
    }
}
于 2019-11-10T19:04:09.110 回答