使用Zenject连接Mapbox SDK

时间:2017-12-08 16:18:10

标签: unity3d mapbox zenject

我正在使用Mapbox SDK和RoadArchitect并尝试构建一些使用Mapbox生成矢量列表的游戏初始化代码,然后在Road Architect中获取矢量和调用函数列表以生成道路GameObjects。为了做到这一点,我需要等到Mapbox完成它的工作才能运行代码来生成道路。我将Mapbox MergedModifierStack扩展为ObservedModifierStack并添加了StackComplete事件。

我当前的场景设置有2个相关的游戏对象:

  • 地图(Mapbox AbstractMap
    • 包含(伪路径,可能不是100%准确):Map.VectorTileFactory.Factories[m].Visualizer.ObservedModifierStack .Modifiers[n].MyModifier
  • RoadArchitect 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消息系统,并将消息中的矢量列表传递给MyObjectCreatorGSDRoadSystem将通过Unity提供的服务定位器找到相应的{{1}}。不理想,但鉴于这是一次性设置,RoadArchitect处理将使任何额外的时间或内存相形见绌,即使它有点不优雅,即使我有点不优雅。 d而不是学习如何让Zenject连接起来,如果可能的话(也许不是因为Mapbox如何构建东西)。

我确实有相当广泛的背景与DI(Autofac,Ninject,穷人等)合作,但这是我第一次涉足Unity3d。我可以允许Unity使用云计算,解决方案很明显,但我现在还没有看到它。

1 个答案:

答案 0 :(得分:1)

对于不是由Zenject创建且不在初始场景中的对象,您需要自己手动注入它们。您可以先将DiContainer注入其中一个类,然后在第三方代码创建的对象上调用DiContainer.InjectDiContainer.InjectGameObject来完成此操作。