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
相关产品推荐
相关产品推荐

