先说一下我遇到的问题,我弄了一个对象池管理多个对象,对象池绑定在一个GameObject上,每个对象在OnBecameInvisible时会进行回收(即移出屏幕就回收),但是当场景切换或停止运行程序时场景中如果还有待回收的对象,就会报错,报错显示的信息为,我的对象池GameObject已经被销毁了云云,因为回收的对象我会把他们作为绑定了对象池的GameObject的子级来方便管理。
所以唯一的可能就是脚本方法调用顺序不可控,即不同GameObject的OnBecameInvisible在其它GameObject的OnDestroy之后调用。
在Unity3D中,我们知道GameObject的Update和LateUpdate两个函数的执行顺序是:每一帧中所有GameObject的Update方法都优先LateUpdate方法执行,即所有GameObject的Update方法都执行完毕才会执行LateUpdate方法。
那么我在使用下面3个方法时也认为其执行顺序也同Update和LateUpdate一致:
- OnBecameInvisible:当GameObject存在renderer属性时,消失(不渲染)时会调用;
- OnDisable:SetActivite(false)时调用;
- OnDestroy:销毁时调用;
我认为在关闭程序或场景销毁时,其调用顺序是所有GameObject的OnBecameInvisible调用完毕后才开始调用OnDisable,最后再统一调用OnDestroy方法,即和Update与LateUpdate逻辑一致。
但是实际上并不是这样,对于每个GameObject来说,实际调用顺序是OnDisable->OnBecameInvisible->OnDestroy,但是在多个GameObject直接不能保证调用顺序,可能第一个GameObject的OnDestroy已经调