You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Zenject中抽象类ShipState实现IInitializable无效的原因

问题解答

一、为什么Dispose()能正常执行?

Zenject对实现了IDisposable接口的对象有内置生命周期管理机制:

  • 通过Zenject工厂创建对象时,容器会自动跟踪这些实例。
  • 当容器销毁(比如场景卸载)或实例被Zenject内存管理系统回收时,会自动调用Dispose()方法,不需要显式添加BindInterfaces()或其他绑定配置,这是Zenject为简化资源清理设计的默认行为。

二、为什么Initialize()没被调用?

IInitializable接口的Initialize()方法不会像IDisposable那样自动触发,原因如下:

  • IInitializable默认仅对容器直接实例化的对象(比如Bind<>.AsSingle()绑定的单例)生效,容器启动时会自动调用这些对象的Initialize()。
  • 通过工厂创建的对象,Zenject不会自动执行Initialize(),需要在工厂绑定阶段显式配置,修改InstallShip()中的工厂绑定代码,添加WithInitializable():
Container.BindFactory<ShipStateWaitingToStart, ShipStateWaitingToStart.Factory>()
    .WhenInjectedInto<ShipStateFactory>()
    .WithInitializable();

Container.BindFactory<ShipStateDead, ShipStateDead.Factory>()
    .WhenInjectedInto<ShipStateFactory>()
    .WithInitializable();

Container.BindFactory<ShipStateMoving, ShipStateMoving.Factory>()
    .WhenInjectedInto<ShipStateFactory>()
    .WithInitializable();

你也可以选择在ShipStateFactory创建状态实例后,手动调用Initialize()方法。

内容的提问来源于stack exchange,提问作者gazoon007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:20:52