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

非MonoBehaviour类中如何实现类似Start()的自动初始化功能

问题场景
  • 开发中存在两类自定义类:
    • 类A为继承MonoBehaviour的Unity脚本类,自带引擎生命周期回调,定义的Initialize()初始化方法可以直接在Start()生命周期函数中自动执行,不需要额外手动触发
    • 类B为不继承MonoBehaviour的普通C#类,原有实现要求外部手动创建类实例后,再手动调用Initialize()方法才能完成初始化,开发过程中经常出现漏调用Initialize()引发的逻辑错误
  • 目标:在普通C#类B内部实现类似MonoBehaviourStart()的自动初始化逻辑,无需外部手动调用初始化方法。
初始问题实现(以实现IObjectPooling接口的Popup类为例)

初始代码直接把实例化逻辑写在Initialize()方法中,如果直接在无参构造调用Initialize()会触发无限递归实例化导致栈溢出:

public class Popup : IObjectPooling
{
  private IObjectPooling popup;

  public void Initialize()
  {
    popup = new Popup();
  }
}
可行实现方案

普通C#类没有MonoBehaviour内置的生命周期魔法方法,无法直接使用引擎提供的自动回调。我们可以把原Initialize()中容易引发递归实例化的new Popup()逻辑拆分,通过定义带参构造函数,在实例创建时自动调用Initialize(),配合字段初始化写法即可实现自动初始化效果,不需要外部手动触发初始化调用。

修改后的类实现代码:

public class Popup : IObjectPooling
{
  private IObjectPooling popup;

  // 保留无参构造满足序列化等场景的实例化需求
  public Popup() {}

  // 带参构造完成依赖赋值后自动触发初始化
  public Popup(Popup popup)
  {
    this.popup = popup;
    Initialize();
  }

  public void Initialize()
  {
    // 原有初始化逻辑
    //...
  }
}

字段初始化时直接嵌套传入实例即可自动完成全流程初始化:

[SerializeField] private Popup popup = new(new Popup());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:30:55