大家都遇到过这个报错吧,完整的信息如下:
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已经是空对象了,然后就是上面的报错了,试图访问已经销毁的...