VContainer-resolving/gameobject-injection | 解析——注入到 MonoBehaviours 中
1.VContainer 介绍2.VContainer-about/what-is-vcontainer | 概述——VContainer 是什么?3.VContainer-about/what-is-di | 概述——DI 是什么?4.VContainer-getting-started/installation | 入门——安装5.VContainer-getting-started/hello-world | 入门——Hello World6.VContainer-resolving/constructor-injection | 解析——构造函数注入7.VContainer-resolving/method-injection | 解析——方法注入8.VContainer-resolving/property-field-injection | 解析——属性/字段注入
9.VContainer-resolving/gameobject-injection | 解析——注入到 MonoBehaviours 中
10.VContainer-resolving/container-api | 解析——容器 API11.VContainer-registering/register-type | 注册——注册纯 C# 类型12.VContainer-registering/register-using-delegate | 注册——注册使用委托13.VContainer-registering/register-factory | 注册——注册工厂14.VContainer-registering/register-monobehaviour | 注册——注册 MonoBehaviour15.VContainer-registering/register-scriptable-object | 注册——注册 ScriptableObject16.VContainer-registering/register-collection | 注册——注册集合17.VContainer-registering/register-callbacks | 注册——注册回调18.VContainer-integrations/entrypoint | 集成——纯 C# 入口点19.VContainer-integrations/unitask | 集成——Unitask20.VContainer-integrations/unirx | 集成——UniRx21.VContainer-integrations/messagepipe | 集成——MessagePipe22.VContainer-integrations/ecs | 集成——ECS (beta)23.VContainer-scoping/lifetime-overview | 作用域——生命周期管理总览24.VContainer-scoping/generate-child-via-scene | 作用域——通过场景或 prefab 生成子作用域25.VContainer-scoping/generate-child-with-code-first | 作用域——通过代码优先生成子作用域26.VContainer-scoping/project-root-lifetimescope | 作用域——项目根作用域 LifetimeScope27.VContainer-diagnostics/diagnostics-window | 诊断——VContainer 诊断窗口28.VContainer-optimization/source-generator | 优化——源码生成器29.**VContainer-optimization/async-container-build | 优化——异步容器构建30.VContainer-optimization/parallel-container-build | 优化——并行容器构建31.VContainer-optimization/codegen | 优化——预生成 IL 代码(已弃用)32.VContainer-comparing/comparing-to-zenject | 对比 Zenject33.MessagePipe 中文文档由于 Unity 的 MonoBehaviour
s 不支持构造函数,必须使用 方法注入 来注入依赖项。
注意:即使 MonoBehaviour
的方法带有 [Inject]
特性标记,也不会自动触发注入。必须通过以下三种方式之一手动注入依赖:
- 如果想注入到特定的
MonoBehaviour
,可以在LifetimeScope
的检查器(Inspector)中进行指定。- 所有指定
GameObject
(及其子对象)的MonoBehaviour
s 将在LifetimeScope
初始化时自动Inject
。
- 所有指定
- 使用
RegisterComponent*
系列方法将MonoBehaviour
实例注册到容器中。- 在这种情况下,注册的
MonoBehaviour
将同时Inject
和被Inject
到其他类中。 - 参见 注册 MonoBehaviour
- 在这种情况下,注册的
- 要在运行时注入到动态生成的
MonoBehaviour
s 中(例如预制体的生成),应使用IObjectResolver.Instantiate
代替UnityEngine.Object.Instantiate
。(可以注册工厂模式和对象生成表达式。)
为什么 VContainer 不自动注入到所有 MonoBehaviour
s 中?
- Unity 没有提供监听所有
GameObject
s 或MonoBehaviour
s 创建的机制。与其有一些情况自动Inject
而另一些情况不自动Inject
,我们采用显式Inject
以满足不同需求。 - 推荐在 GameObject 层级调用
InjectGameObject
;不建议直接在MonoBehaviour
s 上执行Inject
。原因如下:MonoBehaviour
是一个 C# 类,允许你为任何东西编写代码,而且它在运行时动态创建/销毁。注入到具有动态生命周期的对象会使引用管理复杂化。最简单的解决方案是不这样做。- VContainer 和 DI 的目的是反转 MonoBehaviour 的控制。
- 视图组件通常是检测事件和发生的起点,但它也可以通知外部世界它拥有检测到的事件。
- 如果
MonoBehaviour
需要显式的Inject
调用,可能会失去 Unity 预制件的可移植性优势。 - 为了让视图组件正常工作,它需要知道要在屏幕上显示的数据/状态,但运行时频繁变化的数据应通过参数传递而非依赖注入
Inject
。
合集:
VContainer 中文文档
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!