1

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

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

  • 地图(地图盒AbstractMap
    • 其中包含(伪属性路径,可能不是 100% 准确):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 正在控制生命周期(由于通过检查器/编辑器进行配置),但我不知道如何解决或使用它通过禅射。

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

我确实有相当广泛的与 DI(Autofac、Ninject、poor-man's 等)合作的背景,但这是我第一次涉足 Unity3d。有可能我允许 Unity 将事物云化,并且解决方案很明显,但我现在没有看到它。

4

1 回答 1

1

对于非 Zenject 创建且不在初始场景中的对象,您需要自己手动注入。您可以通过首先将 DiContainer 注入您的一个类,然后调用由第三方代码创建的对象来DiContainer.Inject执行此操作。DiContainer.InjectGameObject

于 2017-12-09T04:23:27.643 回答