Unity3d 从SettingCollection中选择GameObject
我使用的是Zenject框架,我想为工厂创建的类创建instansiate游戏对象。为此,我在GameInstaller中使用了类似的东西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");`
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的方法相同,如果你采用这种方法,你可以看到。我确实想到了第三种方法,你可以使用,并编辑了我的答案,将其包括在内