我正在使用 Mapbox SDK 和 RoadArchitect 并尝试构建一些使用 Mapbox 生成矢量列表的游戏初始化代码,然后获取该矢量列表并调用 Road Architect 中的函数来生成道路 GameObjects。为了做到这一点,我需要等到 Mapbox 完成它的工作,然后才能运行代码来生成道路。我将 Mapbox MergedModifierStack 扩展为 ObservedModifierStack 并添加了 StackComplete 事件。
我当前的场景设置有 2 个相关的游戏对象:
- 地图(地图盒
AbstractMap
)- 其中包含(伪属性路径,可能不是 100% 准确):
Map.VectorTileFactory.Factories[m].Visualizer.ObservedModifierStack .Modifiers[n].MyModifier
- 其中包含(伪属性路径,可能不是 100% 准确):
- 道路建筑师
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 将事物云化,并且解决方案很明显,但我现在没有看到它。