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

Unity静态类初始化抛出TypeInitializationException问题求助

解决Unity静态助手类的TypeInitializationException/NullReferenceException问题

问题根源

C#中静态类的静态字段按照代码中的声明顺序执行初始化。你的代码里SideCenters声明在Vertices之前,导致初始化SideCenters时,Vertices还未被实例化(仍是null),访问Vertices[0]就会触发NullReferenceException,进而引发类型初始化失败的TypeInitializationException。

解决方案

方案1:调整字段声明顺序

将Vertices移到SideCenters之前,确保Vertices先完成初始化,再被SideCenters引用:

public static class TileConstants
{
    // 先声明并初始化Vertices
    private static readonly Vector3[] Vertices = new Vector3[]
    {
        new Vector3( Cos60, 0f,  Cos30),
        new Vector3( 1f,    0f,  0f),
        new Vector3( Cos60, 0f, -Cos30),
        new Vector3(-Cos60, 0f, -Cos30),
        new Vector3(-1,     0f,  0f),
        new Vector3(-Cos60, 0f,  Cos30)
    };

    // 此时Vertices已初始化完成,可安全引用
    public static readonly Vector3[] SideCenters = new Vector3[]
    {
        (Vertices[0] + Vertices[5]) / 2f,
        (Vertices[1] + Vertices[0]) / 2f,
        (Vertices[2] + Vertices[1]) / 2f,
        (Vertices[3] + Vertices[2]) / 2f,
        (Vertices[4] + Vertices[3]) / 2f,
        (Vertices[5] + Vertices[4]) / 2f
    };

    public const float TileWidth = Sqrt3 * TileVerticeRadius;
    public const float TileHeight = 2 * TileVerticeRadius;
    public const float TileVerticeRadius = 1f;

    private const float Cos30 = Sqrt3 / 2f;
    private const float Cos60 = 0.5f;
    private const float Sqrt3 = 1.7320508075688f;
}

方案2:使用静态构造函数显式控制初始化流程

如果字段关系复杂,可通过静态构造函数明确指定初始化顺序,避免依赖声明顺序:

public static class TileConstants
{
    public static readonly Vector3[] SideCenters;
    private static readonly Vector3[] Vertices;

    public const float TileWidth = Sqrt3 * TileVerticeRadius;
    public const float TileHeight = 2 * TileVerticeRadius;
    public const float TileVerticeRadius = 1f;

    private const float Cos30 = Sqrt3 / 2f;
    private const float Cos60 = 0.5f;
    private const float Sqrt3 = 1.7320508075688f;

    static TileConstants()
    {
        // 第一步:初始化Vertices
        Vertices = new Vector3[]
        {
            new Vector3( Cos60, 0f,  Cos30),
            new Vector3( 1f,    0f,  0f),
            new Vector3( Cos60, 0f, -Cos30),
            new Vector3(-Cos60, 0f, -Cos30),
            new Vector3(-1,     0f,  0f),
            new Vector3(-Cos60, 0f,  Cos30)
        };

        // 第二步:用已初始化的Vertices创建SideCenters
        SideCenters = new Vector3[]
        {
            (Vertices[0] + Vertices[5]) / 2f,
            (Vertices[1] + Vertices[0]) / 2f,
            (Vertices[2] + Vertices[1]) / 2f,
            (Vertices[3] + Vertices[2]) / 2f,
            (Vertices[4] + Vertices[3]) / 2f,
            (Vertices[5] + Vertices[4]) / 2f
        };
    }
}

补充说明

const类型字段不受此问题影响,因为它们是编译时常量,值在编译阶段就已确定,不会参与运行时的静态初始化流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:06:08