很迷的Unity小问题

 

PS: 2020-4-29 现在版本的unity已经不会出现这种情况了

PSS: 2020-9-8 其实还是有的,这是使用event造成的内存泄漏,现在难以避免,只能小心为上。不过好在unity封装了一个UnityEvent,将event的管理权交付给了unity系统,所以在destroy对象后,监听也会一并被解除,就是不知道性能如何。

PSSS:性能不咋地,需要在性能与易用度之间进行取舍

 

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

有GameObj1和GameObj2

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

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

接着我需要把obj1销毁。

 

 

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

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

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

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

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值