先只看你这个show函数,似乎存在着一些问题。
用cc.find("UI" + name)
查找UI结点,只会在Scene一级查找结点,如果UI结点是Scene的孙子结点是查不到的(可以看API文档或自己测试)。而看你的参数有一个parent,也就是UI是可以作为其他结点的子结点的。这就可能会在场景中出现多个相同UI结点的情况。
这样重现这个问题:
- 先调用show函数:
show(Bag, null, UIRoot)
,UIRoot是UI结点的父结点。调用完之后,创建出一个UIBag结点,并且加到UIRoot中。 - 过一会,你再一次调用
show(Bag, null, UIRoot)
,这时就有问题了,因为cc.find找不到UIBag,导致cc.loader.loadRes
再一次被调用,创建出了另一个UIBag,此时,UIRoot下面就有两个UIBag了。
退一步讲,如果你确保parent是scene,也有可能会出问题的,因为cc.loader.loadRes
是异步的,你调了show之后并不会马上创建UIBag,如果在创建出来之前,你又一次调用了show函数(比如快速的点两下按钮),此时还是会有两个UIBag的情况。
另外代码中cc.loader.loadRes中的err这个参数没有处理,当然如果你确信不会加载不成功也可以的,只是从严谨的角度(也才符合你的风格吗:)),判断一下再主动抛错误,就可以在错误中加上更多有用的信息,也利于后面的除错。
还有一个zIndex似乎没有用到
上面可能与崩溃无关,只是从代码的逻辑上看有些问题,也有可能是因为这些问题暴露出引擎的键壮性不够。