我正在使用Mapbox SDK和RoadArchitect并尝试构建一些使用Mapbox生成矢量列表的游戏初始化代码,然后在Road Architect中获取矢量和调用函数列表以生成道路GameObjects。为了做到这一点,我需要等到Mapbox完成它的工作才能运行代码来生成道路。我将Mapbox MergedModifierStack扩展为ObservedModifierStack并添加了StackComplete事件。
我当前的场景设置有2个相关的游戏对象:
AbstractMap
)
Map.VectorTileFactory.Factories[m].Visualizer.ObservedModifierStack .Modifiers[n].MyModifier
GSDRoadSystem
Map层次结构中的大多数对象都是ScriptableObject
,并且所有对象都是通过编辑器UI中的检查器添加/配置的。
public class MyModifier {
public MyModifier (MyDataObject myDataObject) { ... }
}
public class MyObjectCreator {
public MyObjectCreator(MyDataObject myDataObject, ModifierStack modifierStack) {
...
modifierStack.StackComplete += OnStackComplete();
}
}
在我的OnStackComplete
事件处理程序中,我尝试对GSDRoadSystem
执行函数。我说"尝试"因为我还没有能够弄清楚如何连接所有注入的东西,没有重写Mapbox代码的大部分只是用[Inject]
装饰所有东西,这是我不愿意做的事情鉴于SDK仍处于重大发展阶段。
主要问题似乎是MyModifier
没有注入MyDataObject
,我猜测是因为Mapbox / Unity正在控制生命周期(由于通过检查员/编辑器进行配置) ),但我不知道如何通过Zenject绕过或使用它。
我的另一个选择是搞乱Unity消息系统,并将消息中的矢量列表传递给MyObjectCreator
,GSDRoadSystem
将通过Unity提供的服务定位器找到相应的{{1}}。不理想,但鉴于这是一次性设置,RoadArchitect处理将使任何额外的时间或内存相形见绌,即使它有点不优雅,即使我有点不优雅。 d而不是学习如何让Zenject连接起来,如果可能的话(也许不是因为Mapbox如何构建东西)。
我确实有相当广泛的背景与DI(Autofac,Ninject,穷人等)合作,但这是我第一次涉足Unity3d。我可以允许Unity使用云计算,解决方案很明显,但我现在还没有看到它。
答案 0 :(得分:1)
对于不是由Zenject创建且不在初始场景中的对象,您需要自己手动注入它们。您可以先将DiContainer注入其中一个类,然后在第三方代码创建的对象上调用DiContainer.Inject
或DiContainer.InjectGameObject
来完成此操作。