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