很迷的Unity小问题

最近在写脚本的时候出了个挺诡异的bug。

有GameObj1和GameObj2

obj1上挂载的脚本监听了obj2上的脚本里的事件。

很迷的Unity小问题

而obj1上用于响应事件的函数里使用了自身的gameObject属性。

接着我需要把obj1销毁。

很迷的Unity小问题

 

 

在obj1被销毁后,obj2触发了事件,这时log窗口疯狂地报错,提示gameObject已被销毁

懵逼了很久,之后花了大量的时间来找问题的根源。

功夫不负有心人,在我吱吱不倦地搜寻下,终于找到了这个诡异的万恶之源。

因为在我之前的尝试中,我认为,当gameObject被销毁后,其身上挂载地脚本也会被gc收走,监听的函数不再调用。

很迷的Unity小问题

但这时我发现之前似乎都是巧合,可能是由于某些逻辑原因造成了我对于机制的误判。

当gameObject被销毁后,脚本若是在监听某些事件,是不会被gc收走

这就可以解释之前出现的情况。

我的监听函数里有调用gameObject的语句,当gameObject已经被Destroy了,脚本仍然在监听,此时obj2触发了事件,失去了gameObject的监听脚本自然会报gameObject已被销毁之类的错误。

那么要解决这个问题的话,我就得在对象销毁时解除所有事件的监听。

这显然太麻烦了,有一万种原因会让我忘记这个操作,引起的bug也并不是那么好找。

目前还没有更好的方法来替代它。