Unity新手开发小球躲避游戏时遭遇MissingReferenceException错误求助
解决Unity MissingReferenceException问题:已销毁对象的引用访问
首先,我们来拆解这个错误:MissingReferenceException 出现的核心原因是,你的代码尝试访问一个已经被销毁的GameObject实例。从错误栈可以看到,问题出在ObstacleSpawner.cs的第26行——也就是调用Instantiate的那一行,这说明你用来生成障碍物的原始对象(obstacle数组里的元素)已经被销毁了。
问题根源分析
你的ObstacleSpawner脚本里的obstacle数组,大概率是误拖入了场景中已经存在的障碍物实例,而不是Project面板里的预制体。当这个场景中的实例被Destroyer脚本销毁后,obstacle数组里的引用就变成了无效的“空壳”,下次调用Instantiate时就会触发这个错误。
具体修复步骤
修正预制体引用
打开你的ObstacleSpawner组件所在的对象,检查obstacle数组的赋值:确保拖入数组的是Project面板里的障碍物预制体,而不是Scene面板里的任何实例对象。预制体不会被销毁,能保证Instantiate调用时始终有有效的引用。添加空引用检查(防御性编程)
修改spawner方法,在实例化前先检查目标对象是否有效,避免空引用报错:public void spawner() { int randomObstacleIndex = Random.Range(0, obstacle.Length); // 改用数组长度,更灵活 GameObject targetObstacle = obstacle[randomObstacleIndex]; if (targetObstacle != null) { Instantiate(targetObstacle, new Vector3(Random.Range(-3f, 3f), transform.position.y, transform.position.z), Quaternion.identity); } else { Debug.LogError($"警告:障碍物数组的第{randomObstacleIndex}位元素为空或已被销毁!"); } }额外优化建议
- 把
Random.Range(0, 2)改成Random.Range(0, obstacle.Length),这样以后调整障碍物类型数量时,不用手动修改数值,代码更健壮。 - 检查
Destroyer脚本的触发碰撞体:确保它的Collider组件勾选了Is Trigger,并且障碍物对象也有Collider(非触发)和Rigidbody(如果需要物理碰撞),保证OnTriggerEnter能正确触发。 - 同步移动速度:你的
ObstacleSpawner和Destroyer都在向前移动,建议把它们的移动速度统一或者关联,避免出现障碍物还没到达销毁区域就跑出视野,或者销毁器追不上的情况。
- 把
内容的提问来源于stack exchange,提问作者vikram
相关产品推荐
相关产品推荐

