我以为做个进度条很简单,分分钟解决,结果折腾了一天才搞定,Unity有很多坑,要做完美需要逐一解决.

问题1:最简单的方法不能实现100%的进度

用最简单的方法来实现,不能实现100%的进度,原因是Unity加载完新场景立马就激活新场景了,无法显示最后的进度.解决办法就是使用allowSceneActivation来控制进入场景的时机.

问题2:使用allowSceneActivation后进度卡在90%

这个问题官网论坛也有人讨论,解决办法就是自己手动修补最后的10%,

问题3:进度条一顿一顿地增加.不平滑

解决办法手动插值平滑

问题4:www和LoadLevelAsync两部分进度的整合问题

大部分场景是打成Bundle包的,先要WWW加载,再LoadLevelAsync,两部分的进度要整合在一起,

少量场景是不打Bundle包的,比如登录场景,

  1. if (nextSceneID == (int)GlobeEnum.SceneDefine.LOGIN)
  2. yield return StartCoroutine(LoadNormalScene(sceneTable.ResName));
  3. else
  4. yield return StartCoroutine(LoadBundleScene(sceneTable.ResName));

问题5:用yield return null代替Update()来处理每帧的进度界面更新.

用yield return null来处理更新,比如在Update函数里面处理,代码更简洁,但是要注意一个问题就是while死循环的问题

每个while的地方必须要对应一个yield return null,

经过以上处理,进度条看起来完美了很多,终于能满足我这个完美主义者的要求了. (o_o)

代码如下:

  1. IEnumerator LoadNormalScene(string sceneName, float startPercent = 0)
  2. {
  3. GameRoot.Instance.CurrentSceneId = (int)LoadingWindow.nextSceneID;
  4. loadingText.text = "加载场景中...";
  5. int startProgress = (int)(startPercent * 100);
  6. int displayProgress = startProgress;
  7. int toProgress = startProgress;
  8. AsyncOperation op = Application.LoadLevelAsync(sceneName);
  9. op.allowSceneActivation = false;
  10. while (op.progress < 0.9f)
  11. {
  12. toProgress = startProgress + (int)(op.progress * (1.0f - startPercent) * 100);
  13. while (displayProgress < toProgress)
  14. {
  15. ++displayProgress;
  16. SetProgress(displayProgress);
  17. yield return null;
  18. }
  19. yield return null;
  20. }
  21. toProgress = 100;
  22. while (displayProgress < toProgress)
  23. {
  24. ++displayProgress;
  25. SetProgress(displayProgress);
  26. yield return null;
  27. }
  28. op.allowSceneActivation = true;
  29. }
  30. IEnumerator LoadBundleScene(string sceneName)
  31. {
  32. string path = BundleManager.GetBundleLoadPath(BundleManager.PathSceneData, sceneName + ".data");
  33. WWW www = new WWW(path);
  34. loadingText.text = "加载资源包中...";
  35. int displayProgress = 0;
  36. int toProgress = 0;
  37. while (!www.isDone)
  38. {
  39. toProgress = (int)(www.progress * m_BundlePercent * 100);
  40. while (displayProgress < toProgress)
  41. {
  42. ++displayProgress;
  43. SetProgress(displayProgress);
  44. yield return null;
  45. }
  46. yield return null;
  47. }
  48. toProgress = (int)(m_BundlePercent * 100);
  49. while (displayProgress < toProgress)
  50. {
  51. ++displayProgress;
  52. SetProgress(displayProgress);
  53. yield return null;
  54. }
  55. yield return www;
  56. if (null != www.assetBundle)
  57. {
  58. m_LastSceneBundle = www.assetBundle;
  59. yield return StartCoroutine(LoadNormalScene(sceneName, m_BundlePercent));
  60. }
  61. }
  62. void SetProgress(int progress)
  63. {
  64. loadingBar.value = progress * 0.01f;
  65. loadingProgress.text = progress.ToString() + " %";
  66. }

LoadNoramlScene表示加载没有打包的场景

LoadBundleScene表示加载打包的场景

m_BundlePercent表示加载bundle包占总进度的百分比,默认0.7f

Unity3D手游开发日记(3) - 场景加载进度条的完美方案的更多相关文章

  1. NGUI的异步场景加载进度条

    1.直接创建三个场景,其中第二个场景是用来显示进度条加载的界面,进度条用UISlider,不会的看我前面的博文就可以了. 2.这里提供两种方法,建议使用第一种,加载比较平缓 方法一: using Sy ...

  2. Unity3D手游开发日记(6) - 适合移动平台的水深处理

    市面上大部分的手机游戏,水面都比较粗糙,也基本没发现谁做过水深的处理. 水深的处理在PC平台比较容易,因为很容易获得每个像素的深度,比如G-Buffer,有了像素的深度,就能计算出每个像素到水面的距离 ...

  3. Unity3D手游开发日记(9) - 互动草的效果

    所谓互动草,就是角色跑动或者释放技能,能影响草的摆动方向和幅度. 前面的文章早已经实现了风吹草动的效果,迟迟没有在Unity上面做互动草,是因为以前我在端游项目做过一套太过于牛逼的方案.在CE3的互动 ...

  4. ios开发之--给WebView加载进度条

    不是新东西,就是在项目里面用到H5页面的时候,中间加载延迟的时候,在最上面加载一个进度条,代码如下: // 获取屏幕 宽度.高度 bounds就是屏幕的全部区域 #define KDeviceWidt ...

  5. Unity3D手游开发日记(4) - 适合移动平台的热浪扭曲

    热浪扭曲效果的实现,分两部分,一是抓图,二是扭曲扰动.其中难点在于抓图的处理,网上的解决方案有两种,在移动平台都有很多问题,只好自己实现了一种新的方案,效果还不错. 网上方案1. 用GrabPass抓 ...

  6. Unity3D手游开发日记(7) - 适合移动平台的天气效果

    腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统? 而且没有G-Buffer的支持,很多牛逼效果实现不了,比如角色 ...

  7. Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动

    一直在思考怎么让场景更有生机,我觉得植被的随风摆动是必不可少的.CE3引擎的植被bending就做得特别棒.我也准备在手机上做一套. 先分析一下植被摆动常见的几种做法.其实不管哪种做法,核心就是让植被 ...

  8. Unity3D手游开发日记(1) - 移动平台实时阴影方案

    阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...

  9. Unity3D手游开发日记(8) - 运动残影效果

    2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...

随机推荐

  1. commons fileupload上传报错

    这个问题困扰我好久了一直没有找到解决方法,先记录下来. 生产环境(简称A)上老是出错,而测试环境(简称B)一切正常. 我们的框架是JAVA语言编写,基于struts1技术总监自己搭的框架,我在stru ...

  2. CSP201312-3:最大的矩形

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  3. Python基础灬文件常用操作

    文件常用操作 文件内建函数和方法 open() :打开文件 read():输入 readline():输入一行 seek():文件内移动 write():输出 close():关闭文件 写文件writ ...

  4. Hibernate查询的六种方式

        Hibernate查询的六种方式 分别是HQL查询,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询. 如果单纯的使用hibernate ...

  5. 禁用 Python GC,Instagram 性能提升10%

    通过关闭 Python 垃圾收集(GC)机制,该机制通过收集和释放未使用的数据来回收内存,Instagram 的运行效率提高了 10 %.是的,你没听错!通过禁用 GC,我们可以减少内存占用并提高 C ...

  6. mysql基础知识大全

    前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...

  7. PHPDoc 学习记录

    https://zh.wikipedia.org/wiki/PHPDoc PHPDoc 是一个 PHP 版的 Javadoc.它是一种注释 PHP 代码的正式标准.它支持通过类似 phpDocumen ...

  8. scrum立会报告+燃尽图(第二周第七次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2252 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公冶 ...

  9. Python:生成器的简单理解

    一.什么是生成器 在Python中,由于受到内存的限制,列表容量肯定是有限的.例如我们创建一个包含一亿个元素的列表,Python首先会在内存中开辟足够的空间来存储这个包含一亿个元素的列表,然后才允许用 ...

  10. 读我是一只it小小鸟有感!!!

    <<我是一只it小小鸟>>是老师为我们这些即将步入it行业的新人推荐的一本书,通过这本书的简介知道它是由一群it学子共同创造而成的,每个人分别讲述各自的成长经历.书的开篇是本书 ...