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

