Unity Zenject:如何在GameObjectContext中调用MonoBehaviour子类的Construct方法?
解决方案
问题出在GameObjectContext的作用域限制:它只负责管理自身及子对象的依赖注入,而你的Character组件所在的GameObject不在GameObjectContext的层级下,所以Zenject不会自动触发它的Construct方法。而SceneContext是全局作用域,能覆盖整个场景的对象,所以可以正常注入。
下面是两种可行的解决方式:
方式一:调整对象层级(推荐)
这是符合Zenject设计理念的标准做法:
- 将带有
Rigidbody和Character组件的游戏对象,拖到挂载了GameObjectContext的游戏对象下方,作为它的子对象。 - 修改
PlayerInstaller代码,移除手动绑定Character实例的逻辑,让Zenject自动扫描子对象并注入:
using UnityEngine; using Zenject; public class PlayerInstaller : MonoInstaller { [SerializeField] private Rigidbody m_PlayerRigidbody; public override void InstallBindings() { // 绑定刚体实例 Container.Bind<Rigidbody>().FromInstance(m_PlayerRigidbody).AsSingle(); // 从子对象中自动找到Character组件并绑定 Container.Bind<Character>().FromComponentInChildren().AsSingle(); } }
- 确认
GameObjectContext组件的Auto Inject Game Objects选项处于勾选状态(默认是勾选的),该选项会自动扫描子对象的MonoBehaviour并完成注入。
方式二:手动触发注入(不推荐,仅用于无法调整层级的场景)
如果不能调整对象层级,可以在PlayerInstaller中手动调用注入方法:
using UnityEngine; using Zenject; public class PlayerInstaller : MonoInstaller { [SerializeField] private Rigidbody m_PlayerRigidbody; [SerializeField] private Character m_TheCharacter; public override void InstallBindings() { Container.Bind<Rigidbody>().FromInstance(m_PlayerRigidbody).AsSingle(); Container.Bind<Character>().FromInstance(m_TheCharacter).AsSingle(); // 手动触发Character的注入逻辑 Container.Inject(m_TheCharacter); } }
内容的提问来源于stack exchange,提问作者user21396294
相关产品推荐
相关产品推荐

