使用 Zenject 连接 Mapbox SDK

Using Zenject to wire up Mapbox SDK

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

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

Map 层次结构中的大多数对象都是 ScriptableObject,而且都是 added/configured 通过编辑器中的检查器 UI。

public class MyModifier {
    public MyModifier (MyDataObject myDataObject) { ... }
}

public class MyObjectCreator {
    public MyObjectCreator(MyDataObject myDataObject, ModifierStack modifierStack) {
        ...
        modifierStack.StackComplete += OnStackComplete();
    }
}

在我的 OnStackComplete 事件处理程序中,我试图针对 GSDRoadSystem 执行函数。我说 "attempt" 是因为我无法弄清楚如何将所有东西连接起来进行注入,除了重写大部分 Mapbox 代码只是为了用 [Inject] 装饰所有东西,这是我不愿意做,因为 SDK 仍在大力开发中。

主要问题似乎是 MyModifier 没有注入 MyDataObject,我猜是因为 Mapbox/Unity 正在控制生命周期(由于通过 [=49 配置=]), 但我不知道如何通过 Zenject 绕过或处理它。

我的另一个选择是搞乱 Unity 消息系统,并将消息中的矢量列表传递给 MyObjectCreator,后者将通过 Unity 提供的服务定位器找到适当的 GSDRoadSystem。不理想,但考虑到这是一次性设置,RoadArchitect 处理将使可能花费的任何额外时间或内存相形见绌我接受它,即使它有点不雅,但我宁愿学习如何让 Zenject 连接起来,如果可能的话(也许不是因为 Mapbox 构建东西的方式)。

我确实有相当广泛的 DI 工作背景(Autofac、Ninject、穷人的等等),但这是我第一次涉足 Unity3d。有可能我允许 Unity 对事物进行云处理,解决方案很明显,但我现在没有看到它。

对于非Zenject创建的、不在初始场景中的对象,需要您自己手动注入。您可以通过首先将 DiContainer 注入您的 类 之一,然后在第三方代码创建的对象上调用 DiContainer.InjectDiContainer.InjectGameObject 来实现。