如何让预制体的动态加载全部加载完后再显示预制体

   各位论坛的大神大哥们,小弟想做一个效果:一个预制体上有很多动态加载的图片,我想在打开这个板子时等待动态加载的图片全部加载完后再去显示这个板子,比如,点击打开板子的按钮,屏幕上显示一个加载中的动画,等待板子加载完成以及动态资源加载完成后加载动画消失,板子显示。
   之前想过一个方案是:首先在动态加载预制体时,显示播放加载动画,然后预制体加载完成后将预制体透明度设置为0,接着把所有该预制体要动态加载的资源的方法全写在onload中,使用promise的方法等待加载资源,等到预制体中资源全部加载完后触发事件,将加载动画隐藏,将预制体透明度设为255。
   但是该方案实际操作太过麻烦,而且无法解决预制体中通过cc.instance的方式进行动态加载的资源节点,所以 请教论坛各位大牛有没有更好的方案。

这个排版为啥会这么奇怪?

各位论坛的大神大哥们,小弟想做一个效果:一个预制体上有很多动态加载的图片,我想在打开这个板子时等待动态加载的图片全部加载完后再去显示这个板子,比如,点击打开板子的按钮,屏幕上显示一个加载中的动画,等待板子加载完成以及动态资源加载完成后加载动画消失,板子显示。
之前想过一个方案是:首先在动态加载预制体时,显示播放加载动画,然后预制体加载完成后将预制体透明度设置为0,接着把所有该预制体要动态加载的资源的方法全写在onload中,使用promise的方法等待加载资源,等到预制体中资源全部加载完后触发事件,将加载动画隐藏,将预制体透明度设为255。
但是该方案实际操作太过麻烦,而且无法解决预制体中通过cc.instance的方式进行动态加载的资源节点,所以 请教论坛各位大牛有没有更好的方案。

在绑定的脚本上 添加对应的prefab、Spriteframe属性 然后把相应的资源拖上去就可以了吧

因为这些资源每次打开时都是不同的,所以采用的是动态加载,现在遇到的问题是打开板子会发现图片资源还没显示,几秒钟后才全部显示,所以想做一个加载动画,如果是静态加载的话是不会遇到这个问题的。

那你封装一个 批量加载资源 的同步接口不就完了吗?

你的意思是先将板子用到的所有资源批量加载?我一开始也想过,只是我们这个项目的资源很杂,这个方案不可行呀

为何 不能提前知道需要加载哪些资源吗?

等加载完通知一下隐藏加载动画就可以了吧

对的,因为资源是分散在很多包里,所以想要知道用到哪些资源将是一个十分痛苦的过程,这个方案一开始就被我们否决了,其实也是项目问题导致的

这个是可以做到,你看我的问题描述,这个方案无法解决动态加载cc.instance加载的资源

在prefab上绑定一个脚本,设置base_count=0,target_count=n。每次加载完一个资源(回调orPromise)后base_count+=1,然后判定一次是否到达n,如果到达了,则设定prefab_node.active=true

你这个解决方案貌似有几个问题啊,首先是板子active为false时是不会加载挂载的脚本的,然后这个方案仍旧无法解决板子中通过cc.instance加载的资源显示问题,不过仍是谢谢你的回答~

这个问题一般是因为你将加载资源的逻辑显示在onLoad()中了,一般可以通过手动调用的方式完成。
也有简单的替代方法是:不修改active,直接修改position使其在屏幕外,或者修改opacity=0。

另外?为什么无法解决通过cc.instance加载的资源显示问题?

因为板子里存在复制的node,然后这些复制的node的图片显示也是异步加载的,更可恶的是这些复制的节点加载不在onLoad中,所以才想不出好的方案等待全部加载完再去显示,你说的手动调用的方式是什么意思?能详细说一下嘛?

我觉得你这个问题的根源还是设计的问题,使用到了多次+多级的异步加载,却对异步加载没有写对应的管理方法。
比如:在需要复制的node上的挂载一个脚本,在其中使用Promise封装一个当前node下所有图片的加载逻辑,然后在上层脚本中手动调用1次。

还有一个替代解决方案:监听法。
instantiate后获取板子中所有需要异步加载的图片sprite,每隔0.1s遍历监听1次spriteFrame,如果还有为null的,就跳过;如果全部加载完毕不为null,则显示。

恩,可以试试