Unity中使用单例的需要注意的一个问题

        在Unity中,经常为了访问特定的对象方便,将这个特定的对象作为类的单例,这样当希望访问这个对象的时候,直接通过类就能找到这个对象了。

        假设这个对象在特定的Level中始终存在而不会被销毁的时候,一般也不会有什么问题。但是,如果这个对象有可能被删除,或者被替换,这就有可能会导致混乱,即便我们在使用这个单例对象的时候,总是事先检查这个单例对象是否存在也避免不了。

        最近的一个项目里有这么个情况,我在Level里面加载一个ab包,加载之后这个ab包里面的一个对象会成为类的单例,比如这个类叫Zong,单例的引用叫instance,那么访问这个单例的时候,我们会使用Zong.instance这种写法,一开始的时候也没有什么问题,直到有另一个也包含了Zong类型的对象的ab包里面加载进来的时候,这就开始乱套了。

        本来我以为的逻辑是在前面的ab包卸载之后再加载后面的ab包不会造成单例的冲突,但是由于我使用了异步的方式卸载的前面的ab包,导致在前面的Zong单例对象没有被销毁之前,后面的新加载的ab包就被激活,也不知道是老的ab包里面的内容访问了新的ab包的单例,还是新的ab包的内容访问了还没有被销毁的老的ab包里面的单例,总之,最终访问出现了混乱。哎,这段话写完了我自己都有点儿晕呼。

        最后解决的办法是,在老的ab包开始卸载之前先把Zong.instance设置为null,而不是等待原来的对象被销毁才被动的将Zong.instance设置为null,同时,新的单例设置不在Awake方法里面进行,而是在OnEnable里面或者Start里面进行,这样将两个单例的的交替错开一下,问题就解决了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值