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里面进行,这样将两个单例的的交替错开一下,问题就解决了。

你可能感兴趣的:(Unity心得,Unity,单例)