VContainer-resolving/gameobject-injection | 解析——注入到 MonoBehaviours 中

由于 Unity 的 MonoBehaviours 不支持构造函数,必须使用 方法注入 来注入依赖项。

注意:即使 MonoBehaviour 的方法带有 [Inject] 特性标记,也不会自动触发注入。必须通过以下三种方式之一手动注入依赖:

  1. 如果想注入到特定的 MonoBehaviour,可以在 LifetimeScope 的检查器(Inspector)中进行指定。
    • 所有指定 GameObject(及其子对象)的 MonoBehaviours 将在 LifetimeScope 初始化时自动 Inject
  2. 使用 RegisterComponent* 系列方法将 MonoBehaviour 实例注册到容器中。
    • 在这种情况下,注册的 MonoBehaviour 将同时 Inject 和被 Inject 到其他类中。
    • 参见 注册 MonoBehaviour
  3. 要在运行时注入到动态生成的 MonoBehaviours 中(例如预制体的生成),应使用 IObjectResolver.Instantiate 代替 UnityEngine.Object.Instantiate。(可以注册工厂模式和对象生成表达式。)

为什么 VContainer 不自动注入到所有 MonoBehaviours 中?

  • Unity 没有提供监听所有 GameObjects 或 MonoBehaviours 创建的机制。与其有一些情况自动 Inject 而另一些情况不自动 Inject,我们采用显式 Inject 以满足不同需求。
  • 推荐在 GameObject 层级调用 InjectGameObject;不建议直接在 MonoBehaviours 上执行 Inject。原因如下:
    • MonoBehaviour 是一个 C# 类,允许你为任何东西编写代码,而且它在运行时动态创建/销毁。注入到具有动态生命周期的对象会使引用管理复杂化。最简单的解决方案是不这样做。
    • VContainer 和 DI 的目的是反转 MonoBehaviour 的控制。
      • 视图组件通常是检测事件和发生的起点,但它也可以通知外部世界它拥有检测到的事件。
    • 如果 MonoBehaviour 需要显式的 Inject 调用,可能会失去 Unity 预制件的可移植性优势。
    • 为了让视图组件正常工作,它需要知道要在屏幕上显示的数据/状态,但运行时频繁变化的数据应通过参数传递而非依赖注入 Inject
posted @   凌雪寒  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示