通过Factory或Pool的子容器实例化随机或选定的预制件

我有一系列预制件,我希望能够实例化通过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.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进行子容器绑定。

lhfeic 回答:通过Factory或Pool的子容器实例化随机或选定的预制件

您是对的,实际上并没有一种非常优雅的方法来动态选择子容器预制件。

今天我花了一些时间来{@ {3}}使它变得更好。如果您使用的是最新版本的this commit,则可以执行以下操作:

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)];
    }
}
本文链接:https://www.f2er.com/3130952.html

大家都在问