Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 从SettingCollection中选择GameObject_Unity3d_Dependency Injection_Zenject - Fatal编程技术网

Unity3d 从SettingCollection中选择GameObject

Unity3d 从SettingCollection中选择GameObject,unity3d,dependency-injection,zenject,Unity3d,Dependency Injection,Zenject,我使用的是Zenject框架,我想为工厂创建的类创建instansiate游戏对象。为此,我在GameInstaller中使用了类似的东西 Container.BindFactory<int,int,Hex, Hex.Factory(). FromComponentInNewPrefab(_settings.PlainHexPrefab[0]). WithGameObjectName("Hex"). UnderTransformGroup("Zenject");`

我使用的是Zenject框架,我想为工厂创建的类创建instansiate游戏对象。为此,我在GameInstaller中使用了类似的东西

Container.BindFactory<int,int,Hex, Hex.Factory().
    FromComponentInNewPrefab(_settings.PlainHexPrefab[0]).
    WithGameObjectName("Hex").
    UnderTransformGroup("Zenject");`

它的工作很好,但在我的例子中,在_settings.PlainHexPrefab中,我有一个游戏对象集合,我需要从Hex对象中选择一个属性依赖项。我该怎么做呢?

这里有三种可能适合您的方法:

FromMethod

public class Hex : MonoBehaviour
{
    public class Factory : PlaceholderFactory<int, int, Hex>
    {
    }
}

public class TestInstaller : MonoInstaller<TestInstaller>
{
    public GameObject[] HexPrefabs;

    public override void InstallBindings()
    {
        Container.BindFactory<int, int, Hex, Hex.Factory>().FromMethod(CreateHex);
    }

    Hex CreateHex(DiContainer _, int p1, int p2)
    {
        var prefab = HexPrefabs[Random.RandomRange(0, HexPrefabs.Count() -1)];
        return Container.InstantiatePrefabForComponent<Hex>(prefab);
    }
}
海关工厂

public class HexFactory : IFactory<int, int, Hex>
{
    readonly DiContainer _container;
    readonly GameObject[] _prefabs;

    public HexFactory(
        GameObject[] prefabs,
        DiContainer container)
    {
        _container = container;
        _prefabs = prefabs;
    }

    public Hex Create(int p1, int p2)
    {
        var prefab = _prefabs[Random.RandomRange(0, _prefabs.Count() -1)];
        return _container.InstantiatePrefabForComponent<Hex>(prefab);
    }
}

public class TestInstaller : MonoInstaller<TestInstaller>
{
    public GameObject[] HexPrefabs;

    public override void InstallBindings()
    {
        Container.BindFactory<int, int, Hex, Hex.Factory>()
            .FromIFactory(b => b.To<HexFactory>().AsSingle().WithArguments(HexPrefabs));
    }
}
自定义工厂中的子工厂。这还有一个优点,即每个预制厂都应该经过“验证”

public class CustomHexFactory : IFactory<int, Hex>
{
    readonly List<Hex.Factory> _subFactories;

    public CustomHexFactory(List<Hex.Factory> subFactories)
    {
        _subFactories = subFactories;
    }

    public Hex Create(int p1)
    {
        return _subFactories[Random.RandomRange(0, _subFactories.Count() -1)].Create(p1);
    }
}

public class TestInstaller : MonoInstaller<TestInstaller>
{
    public GameObject[] HexPrefabs;

    public override void InstallBindings()
    {
        foreach (var prefab in HexPrefabs)
        {
            Container.BindFactory<int, Hex, Hex.Factory>().FromComponentInNewPrefab(prefab)
                .WhenInjectedInto<CustomHexFactory>();
        }

        Container.BindFactory<int, Hex, Hex.Factory>().FromFactory<CustomHexFactory>();
    }
}

是的,我已经做了类似于第二个变体的东西,只有两个小差异。1在安装程序中,我编写了Container.BindFactory.FromFactory;这和你的建议是一样的,因为我知道我在工厂直接通过预制阵列,但在安装程序中没有。在那之后,我有两个问题。1这两种方法之间有区别吗?2当项目正在构建时,我在Hex对象中遇到了关于解析int类型的异常,无法解析类型“System.Int32”,而构建类型为“Hex”的对象。嗯,我找到了异常类型“无法解析类型”System.Int32的问题解决方法,在构建类型为“Hex”的对象时,我只是按工厂发送参数:public Hex Createint param1、int param2、float param3、float param4{//some code var go=GetGOForHexTypeel,moiT;返回_container.instanceprefabforcomponentgo,新对象[]{param1,param2,param3,param4};}它终于起作用了,但我仍然认为它并不完美,也许你能看到更正确的方法吗?是的,使用FromFactory基本上与我使用FromIFactory的方法相同,如果你采用这种方法,你可以看到。我确实想到了第三种方法,你可以使用,并编辑了我的答案,将其包括在内