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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:08