U3d常见报错 之 The object of type ‘xxx‘ has been destroyed but you are still trying to access it.

大家都遇到过这个报错吧,完整的信息如下:

MissingReferenceException: The object of type 'Projectile_Bullet' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.

这种一般出现不太好查,因为一般程序也不会主动访问一个已经销毁的对象。出现这个肯定是意外情况下,访问了给destroy的GameObejct了。

下面我列举自己出现过的情况,以便于以后碰到类似的能更快的定位问题。

1.最简单的逻辑错误:访问对象前没有检查null。这种情况有时候面临的难题是gameobject的Destroy本身不是立即销毁的,有时候调用Destroy还是能访问部分成员,但是调用函数会报错,可以给对象加一个是否销毁状态hasDestroy,调用Destroy时把hasDestroy改为已经销毁状态,访问前判断hasDestroy这个变量,不会有任何问题和疑虑。

2.异步操作,比如下载,委托:在一个脚本里调用一个异步下载,下载成功后,委托还是要访问脚本的,但是如果这个时候脚本已经被调用Destroy了,也会报上面这个错,这种一般不好排查,只能去分析代码了。所以写类似逻辑时就要考虑到回调后的各种可能。

本次遇到的问题详细情况:有一颗子弹,上面挂了一个脚本A,子弹在销毁后要被对象池回收重复利用,同时会Destroy掉脚本A,因为下次被用时,不一定会挂脚本A类型的脚本了,所以这里是要直接销毁掉A。在子弹刚被放入对象池内时,脚本A很有可能还在(还能被Get到),所以下一颗子弹初始化Get脚本A时,很有可能Get到上一个子弹的脚本A,后面代码再访问A时,A已经是空对象了,然后就是上面的报错了,试图访问已经销毁的...

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值