unity3d 切换场景不销毁对象池中的物体方案

         要在手机上玩转u3d,一定会做的一个就是对象池,在这里我不打算讨论对象池本身,基本思路大同小异。我这里想讨论的是切换场景引发的对象池中对象的问题。

        首先如果你什么都不处理,那么一旦你切换场景,你会发现你对象池中所有GameObject本身或者变量全部都变成了null。你下次使用这个对象就会抛出指针异常,所以你肯定会去研究怎么切场景不销毁,ok,你马上就能找到DontDestroyOnLoad方法,只要声明之后,这个物体就不会被销毁。

       然后你发现有那么多对象都需要声明,会很麻烦,所以你可以新建一个物体,挂上不销毁的脚本,然后把不需要销毁的物体全部放到它里面,那么所有的物体切换场景就不会销毁了。

      然后这样做的第一个问题,就是重复加载同样的场景,你会发现这个不销毁的新建的总物体每次都多复制了一个。因为上一次的保存下来,而这一次的还在,这个也不难解决,你可以直接判断场景中是否已经有这个物体,如果有就添加,没有就不用添加了,当然你可以参考雨凇MOMO的做法:http://www.xuanyusong.com/archives/2938(他说他的做法更好。。。虽然我觉得没有他说的那么夸张)

     接下来似乎不会有什么问题,但其实如果你真的在项目中这么做,你会发现还有很大的两个问题。

     1.我们放对象的时候,经常会把对象设置成不同层,比如默认是default, 可能会有UI层,  effect层。ok,当你把不同层的东西都放在一个obj下面的时候,下次再次加载场景时,它的父亲突然就变了。莫名其妙的把这个非销毁的所有物体挂在了UI层下(这是我碰到的情况,也许可能会挂在别的层,总之就是父亲变了)。这样问题就大了,因为如果父亲不是销毁的,那么儿子标记销毁是无效的,而且改变父亲这种行为也不是我们想看到的。也许你觉得只要重新设置一下父亲就好了。。。但所有儿子的Layer也会全被改掉。。。。你得全部重新设置,蛋碎。。。所以不建议这么做。 要解决也不难,只要注意不同层都应该要有自己的一个非销毁obj,比如default有一个,UI也要有一个,这样就不会乱了。

     2.第二个问题才是大问题。切换场景后,现在出现了三种情况,直接

你可能感兴趣的:(u3d)