Unity3D手游开发日记(3) - 场景加载进度条的完美方案
我以为做个进度条很简单,分分钟解决,结果折腾了一天才搞定,Unity有很多坑,要做完美需要逐一解决.
问题1:最简单的方法不能实现100%的进度
用最简单的方法来实现,不能实现100%的进度,原因是Unity加载完新场景立马就激活新场景了,无法显示最后的进度.解决办法就是使用allowSceneActivation来控制进入场景的时机.
问题2:使用allowSceneActivation后进度卡在90%
这个问题官网论坛也有人讨论,解决办法就是自己手动修补最后的10%,
问题3:进度条一顿一顿地增加.不平滑
解决办法手动插值平滑
问题4:www和LoadLevelAsync两部分进度的整合问题
大部分场景是打成Bundle包的,先要WWW加载,再LoadLevelAsync,两部分的进度要整合在一起,
少量场景是不打Bundle包的,比如登录场景,
- if (nextSceneID == (int)GlobeEnum.SceneDefine.LOGIN)
- yield return StartCoroutine(LoadNormalScene(sceneTable.ResName));
- else
- yield return StartCoroutine(LoadBundleScene(sceneTable.ResName));
问题5:用yield return null代替Update()来处理每帧的进度界面更新.
用yield return null来处理更新,比如在Update函数里面处理,代码更简洁,但是要注意一个问题就是while死循环的问题
每个while的地方必须要对应一个yield return null,
经过以上处理,进度条看起来完美了很多,终于能满足我这个完美主义者的要求了. (o_o)
代码如下:
- IEnumerator LoadNormalScene(string sceneName, float startPercent = 0)
- {
- GameRoot.Instance.CurrentSceneId = (int)LoadingWindow.nextSceneID;
- loadingText.text = "加载场景中...";
- int startProgress = (int)(startPercent * 100);
- int displayProgress = startProgress;
- int toProgress = startProgress;
- AsyncOperation op = Application.LoadLevelAsync(sceneName);
- op.allowSceneActivation = false;
- while (op.progress < 0.9f)
- {
- toProgress = startProgress + (int)(op.progress * (1.0f - startPercent) * 100);
- while (displayProgress < toProgress)
- {
- ++displayProgress;
- SetProgress(displayProgress);
- yield return null;
- }
- yield return null;
- }
- toProgress = 100;
- while (displayProgress < toProgress)
- {
- ++displayProgress;
- SetProgress(displayProgress);
- yield return null;
- }
- op.allowSceneActivation = true;
- }
- IEnumerator LoadBundleScene(string sceneName)
- {
- string path = BundleManager.GetBundleLoadPath(BundleManager.PathSceneData, sceneName + ".data");
- WWW www = new WWW(path);
- loadingText.text = "加载资源包中...";
- int displayProgress = 0;
- int toProgress = 0;
- while (!www.isDone)
- {
- toProgress = (int)(www.progress * m_BundlePercent * 100);
- while (displayProgress < toProgress)
- {
- ++displayProgress;
- SetProgress(displayProgress);
- yield return null;
- }
- yield return null;
- }
- toProgress = (int)(m_BundlePercent * 100);
- while (displayProgress < toProgress)
- {
- ++displayProgress;
- SetProgress(displayProgress);
- yield return null;
- }
- yield return www;
- if (null != www.assetBundle)
- {
- m_LastSceneBundle = www.assetBundle;
- yield return StartCoroutine(LoadNormalScene(sceneName, m_BundlePercent));
- }
- }
- void SetProgress(int progress)
- {
- loadingBar.value = progress * 0.01f;
- loadingProgress.text = progress.ToString() + " %";
- }
LoadNoramlScene表示加载没有打包的场景
LoadBundleScene表示加载打包的场景
m_BundlePercent表示加载bundle包占总进度的百分比,默认0.7f
Unity3D手游开发日记(3) - 场景加载进度条的完美方案的更多相关文章
- NGUI的异步场景加载进度条
1.直接创建三个场景,其中第二个场景是用来显示进度条加载的界面,进度条用UISlider,不会的看我前面的博文就可以了. 2.这里提供两种方法,建议使用第一种,加载比较平缓 方法一: using Sy ...
- Unity3D手游开发日记(6) - 适合移动平台的水深处理
市面上大部分的手机游戏,水面都比较粗糙,也基本没发现谁做过水深的处理. 水深的处理在PC平台比较容易,因为很容易获得每个像素的深度,比如G-Buffer,有了像素的深度,就能计算出每个像素到水面的距离 ...
- Unity3D手游开发日记(9) - 互动草的效果
所谓互动草,就是角色跑动或者释放技能,能影响草的摆动方向和幅度. 前面的文章早已经实现了风吹草动的效果,迟迟没有在Unity上面做互动草,是因为以前我在端游项目做过一套太过于牛逼的方案.在CE3的互动 ...
- ios开发之--给WebView加载进度条
不是新东西,就是在项目里面用到H5页面的时候,中间加载延迟的时候,在最上面加载一个进度条,代码如下: // 获取屏幕 宽度.高度 bounds就是屏幕的全部区域 #define KDeviceWidt ...
- Unity3D手游开发日记(4) - 适合移动平台的热浪扭曲
热浪扭曲效果的实现,分两部分,一是抓图,二是扭曲扰动.其中难点在于抓图的处理,网上的解决方案有两种,在移动平台都有很多问题,只好自己实现了一种新的方案,效果还不错. 网上方案1. 用GrabPass抓 ...
- Unity3D手游开发日记(7) - 适合移动平台的天气效果
腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统? 而且没有G-Buffer的支持,很多牛逼效果实现不了,比如角色 ...
- Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动
一直在思考怎么让场景更有生机,我觉得植被的随风摆动是必不可少的.CE3引擎的植被bending就做得特别棒.我也准备在手机上做一套. 先分析一下植被摆动常见的几种做法.其实不管哪种做法,核心就是让植被 ...
- Unity3D手游开发日记(1) - 移动平台实时阴影方案
阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...
- Unity3D手游开发日记(8) - 运动残影效果
2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...
随机推荐
- Elasticsearch5.x版本中对Text类型进行聚合时提示illegal_argument_exception
Having this field in my mapping "answer": { "type": "text", "fiel ...
- java之接口开发-初级篇-webservice协议
webservice协议 客户端: 客户端生成使用soapUI生成 外部提供webservice地址,地址后加?wsdl.选择好目录然后生成,放到项目中实现 服务端: web.xml平级目录下创建se ...
- Codeforces 552 E. Two Teams
E. Two Teams time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- C语言零碎知识点
1. int整形在64位和32位计算机中都占4个字节. 指针在64位占8个字节,32位占4个字节. 2. 数组下标从0开始,a[0]开始,链表下标从1开始,a[1]开始. 3. 条件运算符(con ...
- Flip the Bits(思维)
You are given a positive integer n. Your task is to build a number m by flipping the minimum number ...
- 【探路者】团队中的每一次感动——Alpha版
我是[探路者]团队的leader翟宇豪.在软件工程课程开始时,当听说有团队作业这个任务时,我个人还是对leader这个角色很期待的.我很希望通过自己的努力,让我所在的团队变得更好,让组里的每一个成员在 ...
- windows环境下nginx服务器的安装与配置
转载至:http://www.cnblogs.com/hxxy2003/archive/2012/09/20/2695254.html nginx服务器是一个高性能的HTTP和反向代理服务器,它以稳定 ...
- 团队目标WBS及具体任务分工
• 首先我们讨论了实验第一个冲刺周期要实现的功能,我们的初期目标. • 然后我们进一步梳理了第一阶段的任务和需求. • 之后对任务进行了划分和领取. • 最后每个人对自己的任务进行了估算,并约定 ...
- 用python脚本计算某一个文件的行数
python可以统计文件的行数,你相信吗?不管你信不信反正我信了.下面我们来看一下python怎样统计文件的行数,代码很简单,我也做了注释,很简单的实现... 1 2 3 4 5 6 7 8 9 10 ...
- Alpha 冲刺(9/10)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 多次测试软件运行 学习OPENMP ...