升级Unity 2021.1.26f1后跑酷游戏出现NullReferenceException报错如何解决
错误原因说明
该问题核心是代码逻辑错误,小概率伴随资源配置缺失,具体问题和修复方案如下:
1. 核心错误:LevelManager单例未正确初始化
这是你两处报错的最主要诱因:
- 首先存在语法错误:你写的
public static LevelManager.Instance { set; get;}不符合C#语法规范,属性名前不应该加类名和点 - 其次缺少赋值逻辑:Awake方法中没有给静态Instance属性赋值,导致所有调用
LevelManager.Instance的地方都是空引用,直接触发PieceSpawner第25行的空报错。
修复代码:
修改LevelManager.cs中的单例声明和Awake方法:
// 替换原错误的单例声明 public static LevelManager Instance { get; private set; } private void Awake() { // 单例判重逻辑,避免场景内多个LevelManager冲突 if(Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; cameraContainer = Camera.main.transform; currentSpawnZ = 0; currentLevel = 0; }
2. 次要错误:Segment脚本Awake执行时机问题
第二个报错指向Segment.cs第22行的Awake方法,是因为Unity实例化对象时,Awake的执行优先级高于你给LevelManager.Instance赋值的时机,如果Segment的Awake中直接调用了LevelManager.Instance,就会拿空值报错。
修复方案:
把Segment.cs的Awake方法中所有依赖LevelManager.Instance的逻辑,移动到Start方法中即可。
3. 配置检查项
如果修改完代码仍有报错,检查以下配置项:
- 场景中必须有且仅有一个挂载了LevelManager脚本的激活对象
- LevelManager的Inspector面板中,
ramps、slides、longblocks、jumps、availableSegments、availableTransition所有公开列表都必须提前拖入对应预制体,不能为空 - 所有Segment预制体必须挂载Segment脚本,所有Piece预制体必须挂载Piece脚本,否则GetComponent会返回空值
内容的提问来源于stack exchange,提问作者SahilnCode
相关产品推荐
相关产品推荐

