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

Unity新手开发小球躲避游戏时遭遇MissingReferenceException错误求助

解决Unity MissingReferenceException问题:已销毁对象的引用访问

首先,我们来拆解这个错误:MissingReferenceException 出现的核心原因是,你的代码尝试访问一个已经被销毁的GameObject实例。从错误栈可以看到,问题出在ObstacleSpawner.cs的第26行——也就是调用Instantiate的那一行,这说明你用来生成障碍物的原始对象(obstacle数组里的元素)已经被销毁了。

问题根源分析

你的ObstacleSpawner脚本里的obstacle数组,大概率是误拖入了场景中已经存在的障碍物实例,而不是Project面板里的预制体。当这个场景中的实例被Destroyer脚本销毁后,obstacle数组里的引用就变成了无效的“空壳”,下次调用Instantiate时就会触发这个错误。

具体修复步骤

  1. 修正预制体引用
    打开你的ObstacleSpawner组件所在的对象,检查obstacle数组的赋值:确保拖入数组的是Project面板里的障碍物预制体,而不是Scene面板里的任何实例对象。预制体不会被销毁,能保证Instantiate调用时始终有有效的引用。

  2. 添加空引用检查(防御性编程)
    修改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}位元素为空或已被销毁!");
        }
    }
    
  3. 额外优化建议

    • 把Random.Range(0, 2)改成Random.Range(0, obstacle.Length),这样以后调整障碍物类型数量时,不用手动修改数值,代码更健壮。
    • 检查Destroyer脚本的触发碰撞体:确保它的Collider组件勾选了Is Trigger,并且障碍物对象也有Collider(非触发)和Rigidbody(如果需要物理碰撞),保证OnTriggerEnter能正确触发。
    • 同步移动速度:你的ObstacleSpawner和Destroyer都在向前移动,建议把它们的移动速度统一或者关联,避免出现障碍物还没到达销毁区域就跑出视野,或者销毁器追不上的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:02:29