Unity中变量声明时new创建的简单类构造函数执行时机咨询
Unity中静态自定义类实例的构造函数执行时机分析
先看你给出的代码示例:
TestScript脚本:
using UnityEngine; public class TestScript : MonoBehaviour { public static SimpleClass ClassInstance = new SimpleClass(10f); }
SimpleClass定义:
public class SimpleClass { public float Value; public SimpleClass(float value) { // 此代码何时执行? Value = value; } }
核心结论
这个构造函数的执行时机和Unity的MonoBehaviour生命周期(Awake/Start等)完全无关,它遵循的是C#本身的静态成员初始化规则:
- 静态字段
ClassInstance属于TestScript这个类本身,而非TestScript的实例。它的初始化会在TestScript类第一次被加载到内存前完成,构造函数也会在此时执行。 - 只要
TestScript类被触发加载(比如挂载到任意GameObject上,哪怕GameObject处于非激活状态;或者项目中有其他代码引用了TestScript类),静态字段就会立即初始化,和脚本是否启用、GameObject是否激活没有关系——这就是你观察到“即使MonoBehaviour被禁用或所在GameObject非激活,ClassInstance仍会被创建”的原因。
补充说明
- 你提到的结构体、List/Array的差异,本质还是C#类型系统的区别:结构体是值类型,静态值类型字段的初始化同样遵循静态规则;List/Array属于.NET内置引用类型,它们的静态行为和自定义类一致,你观察到的编辑器中表现差异,只是Unity脚本加载机制对不同类型的触发时机不同,核心规则是统一的。
- 如果
TestScript从未被任何代码引用,也没有挂载到任何GameObject上,那这个类可能不会被Unity的脚本加载系统加载,静态字段也就不会初始化,构造函数自然不会执行。
内容的提问来源于stack exchange,提问作者sweatyDev
相关产品推荐
相关产品推荐

