- 浏览: 24589 次
- 性别:
- 来自: 上海
文章分类
最新评论
http://www.58player.com/blog-2537-89690.html
背景
通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长。为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来加载主场景。因为Loading场景包含的资源较少,所以加载速度快。在加载主场景的时候一般会在Loading界面中显示一个进度条来告知玩家当前加载的进度。在Unity中可以通过调用Application.LoadLevelAsync函数来异步加载游戏场景,通过查询AsyncOperation.progress的值来得到场景加载的进度。
尝试——遇到问题
第一步当加载完Loading场景后,调用如下的LoadGame函数开始加载游戏场景,使用异步加载的方式加载场景1(Loading场景为0,主场景为1),通过Unity提供的Coroutine机制,我们可以方便的在每一帧结束后调用SetLoadingPercentage函数来更新界面中显示的进度条的数值。
public void LoadGame() {
StartCoroutine(StartLoading_1(1));
}
private IEnumerator StartLoading_1(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
}
最后进度条的效果显示如下:
进度条并没有连续的显示加载的进度,而是停顿一下切换一个数字,再停顿一下切换一个数子,最后在没有显示100%就情况下就切换到主场景了。究其原因在于Application.LoadLevelAsync并不是真正的后台加载,它在每一帧加载一些游戏资源,并给出一个progress值,所以在加载的时候还是会造成游戏卡顿,AsyncOperation.progress的值也不够精确。当主场景加载完毕后Unity就自动切换场景,所以上述代码中的while循环体内的代码是不会被调用的,导致进度条不会显示100%。
修补——100%完成
为了让进度条能显示100%,取巧一点的办法是将AsyncOperation.progress的值乘上2,这样当加载到50%的时候界面上就显示100%了。缺点是当界面上显示100%的时候,用户还要等待一段时间才会进入游戏。其实Unity提供了手动切换场景的方法,把AsyncOperation.allowSceneActivation设为false就可以禁止Unity加载完毕后自动切换场景,修改后的StartLoading_2代码如下:
// this function is not work
private IEnumerator StartLoading_2() {
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
op.allowSceneActivation = true;
}
我们首先将AsyncOperation.allowSceneActivation设为false,当加载完成后再设为true。代码看上去没有错,但是执行的结果是进度条最后会一直停留在90%上,场景不会切换。通过打印log发现AsyncOperation.isDone一直为false,AsyncOperation.progress的值增加到0.9后就保持不变了,也就是说场景永远不会被加载完毕。
在这个帖子中找到了答案,原来把allowSceneActivation设置为false后,Unity就只会加载场景到90%,剩下的10%要等到allowSceneActivation设置为true后才加载,这不得不说是一个坑。所以代码改为如下。当AsyncOperation.progress到达0.9后,就直接把进度条的数值更新为100%,然后设置AsyncOperation.allowSceneActivation为ture,让Unity继续加载未完成的场景。
private IEnumerator StartLoading_3() {
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(op.progress < 0.9f) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
SetLoadingPercentage(100);
yield return new WaitForEndOfFrame();
op.allowSceneActivation = true;
}
最后的效果如下:
打磨——增加动画
上述的进度条虽然解决了100%显示的问题,但由于进度条的数值更新不是连续的,所以看上去不够自然和美观。为了看上去像是在连续加载,可以每一次更新进度条的时候插入过渡数值。这里我采用的策略是当获得AsyncOperation.progress的值后,不立即更新进度条的数值,而是每一帧在原有的数值上加1,这样就会产生数字不停滚动的动画效果了,迅雷中显示下载进度就用了这个方法。
private IEnumerator StartLoading_4() {
int displayProgress = 0;
int toProgress = 0;
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(op.progress < 0.9f) {
toProgress = (int)op.progress * 100;
while(displayProgress < toProgress) {
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
}
toProgress = 100;
while(displayProgress < toProgress){
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
op.allowSceneActivation = true;
}
displayProgress用来记录要显示在进度条上的数值,最后进度条的动画如下:
对比第一种的进度条
总结
如果在加载游戏主场景之前还需要解析数据表格,生成对象池,进行网络连接等操作,那么可以给这些操作赋予一个权值,利用这些权值就可以计算加载的进度了。如果你的场景加载速度非常快,那么可以使用一个假的进度条,让玩家看上几秒钟的loading动画,然后再加载场景。总之进度条虽然小,但要做好也是不容易的。
背景
通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长。为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来加载主场景。因为Loading场景包含的资源较少,所以加载速度快。在加载主场景的时候一般会在Loading界面中显示一个进度条来告知玩家当前加载的进度。在Unity中可以通过调用Application.LoadLevelAsync函数来异步加载游戏场景,通过查询AsyncOperation.progress的值来得到场景加载的进度。
尝试——遇到问题
第一步当加载完Loading场景后,调用如下的LoadGame函数开始加载游戏场景,使用异步加载的方式加载场景1(Loading场景为0,主场景为1),通过Unity提供的Coroutine机制,我们可以方便的在每一帧结束后调用SetLoadingPercentage函数来更新界面中显示的进度条的数值。
public void LoadGame() {
StartCoroutine(StartLoading_1(1));
}
private IEnumerator StartLoading_1(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
}
最后进度条的效果显示如下:
进度条并没有连续的显示加载的进度,而是停顿一下切换一个数字,再停顿一下切换一个数子,最后在没有显示100%就情况下就切换到主场景了。究其原因在于Application.LoadLevelAsync并不是真正的后台加载,它在每一帧加载一些游戏资源,并给出一个progress值,所以在加载的时候还是会造成游戏卡顿,AsyncOperation.progress的值也不够精确。当主场景加载完毕后Unity就自动切换场景,所以上述代码中的while循环体内的代码是不会被调用的,导致进度条不会显示100%。
修补——100%完成
为了让进度条能显示100%,取巧一点的办法是将AsyncOperation.progress的值乘上2,这样当加载到50%的时候界面上就显示100%了。缺点是当界面上显示100%的时候,用户还要等待一段时间才会进入游戏。其实Unity提供了手动切换场景的方法,把AsyncOperation.allowSceneActivation设为false就可以禁止Unity加载完毕后自动切换场景,修改后的StartLoading_2代码如下:
// this function is not work
private IEnumerator StartLoading_2() {
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
op.allowSceneActivation = true;
}
我们首先将AsyncOperation.allowSceneActivation设为false,当加载完成后再设为true。代码看上去没有错,但是执行的结果是进度条最后会一直停留在90%上,场景不会切换。通过打印log发现AsyncOperation.isDone一直为false,AsyncOperation.progress的值增加到0.9后就保持不变了,也就是说场景永远不会被加载完毕。
在这个帖子中找到了答案,原来把allowSceneActivation设置为false后,Unity就只会加载场景到90%,剩下的10%要等到allowSceneActivation设置为true后才加载,这不得不说是一个坑。所以代码改为如下。当AsyncOperation.progress到达0.9后,就直接把进度条的数值更新为100%,然后设置AsyncOperation.allowSceneActivation为ture,让Unity继续加载未完成的场景。
private IEnumerator StartLoading_3() {
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(op.progress < 0.9f) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
SetLoadingPercentage(100);
yield return new WaitForEndOfFrame();
op.allowSceneActivation = true;
}
最后的效果如下:
打磨——增加动画
上述的进度条虽然解决了100%显示的问题,但由于进度条的数值更新不是连续的,所以看上去不够自然和美观。为了看上去像是在连续加载,可以每一次更新进度条的时候插入过渡数值。这里我采用的策略是当获得AsyncOperation.progress的值后,不立即更新进度条的数值,而是每一帧在原有的数值上加1,这样就会产生数字不停滚动的动画效果了,迅雷中显示下载进度就用了这个方法。
private IEnumerator StartLoading_4() {
int displayProgress = 0;
int toProgress = 0;
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(op.progress < 0.9f) {
toProgress = (int)op.progress * 100;
while(displayProgress < toProgress) {
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
}
toProgress = 100;
while(displayProgress < toProgress){
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
op.allowSceneActivation = true;
}
displayProgress用来记录要显示在进度条上的数值,最后进度条的动画如下:
对比第一种的进度条
总结
如果在加载游戏主场景之前还需要解析数据表格,生成对象池,进行网络连接等操作,那么可以给这些操作赋予一个权值,利用这些权值就可以计算加载的进度了。如果你的场景加载速度非常快,那么可以使用一个假的进度条,让玩家看上几秒钟的loading动画,然后再加载场景。总之进度条虽然小,但要做好也是不容易的。
发表评论
-
Unity 3D 学习笔记
2015-06-25 14:45 0http://blog.csdn.net/huang9012/ ... -
如何在Unity3d中实现和网页数据的交互
2015-06-25 13:22 0http://game.ceeger.com/Componen ... -
unity3D 如何提取游戏资源(反编译 )+代码反编译
2015-06-25 12:26 0http://bbs.9ria.com/thread-4011 ... -
糖果爱消除
2015-06-25 12:22 0 糖果爱消除 [脚本] Candy Crash重点代 ... -
unity项目简单实例代码
2015-06-25 11:51 0基础入门 1、基础入门 ... -
帧动画
2015-06-25 11:39 0private float fps = 1000.0f; p ... -
【Unity】技巧集合
2015-03-19 14:42 0【Unity】技巧集合 转发,请保持地址:http://bl ... -
[Unity3D]Unity3D游戏开发之使用UniSky呼风唤雨
2015-02-11 10:52 0[Unity3D]Unity3D游戏开发之使用UniSky呼风 ... -
重要的学习教程!!!!加油,一定要多看多练
2015-02-07 22:43 0http://www.unitymanual.com/topi ... -
[Unity3D]Unity3D 游戏开发之碰撞检测
2015-02-06 17:53 0大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列 ... -
[Unity3D]Unity3D游戏开发之鼠标滚轮实现放大缩小
2015-02-06 17:51 0大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列 ... -
[Unity3D]Unity3D游戏开发之怪物AI
2015-02-06 17:35 0好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章 ... -
Unity3D游戏开发之使用Unity3D开发2D游戏 (一)
2015-02-06 17:23 0http://blog.csdn.net/qinyuanpei ... -
发射小球
2015-02-06 17:05 0using UnityEngine; using System ... -
Unity3D游戏开发之史上最简单的鼠标点击控制人物走动实现
2015-02-06 15:40 1406原文 http://blog.csdn.net/qinyua ... -
【Unity技巧】制作一个简单的NPC
2015-02-06 15:26 1075http://blog.csdn.net/candycat19 ... -
Unity3D游戏中检测摄像机与人之间有无带碰撞器的遮挡物
2015-02-05 17:37 1863Unity3D游戏中检测摄像机与人之间有无带碰撞器的遮挡物。在 ... -
unity中三种调用其他脚本函数的方法
2015-02-02 16:16 1125unity中三种调用其他脚本函数的方法 第一种,被调用脚本函 ... -
CS0119 报错
2015-02-02 10:03 1439问题 :Assets/cudeCM.cs(26,36): er ...
相关推荐
游戏进度条插件
unity游戏场景资源加载进度条Loading Screens for Mad Level Manager ,5种预制进度条样式,自动计算加载时间,支持uGUI和NGUI,可定制强,并且有个等待中与玩家互动的功能,大家自己研究下。
这是一款使用纯CSS3制作的超酷圆形Loading加载进度条特效插件。该loading加载进度条特效有水平进度条和环状进度条两种,该特效在水平或圆形轨道上有一个小球不断运动来达到loading进度条效果。
三款非常酷炫的网页Loading加载进度条动画效果。使用css3 animation技术制作而成。
分享一个Unity3D UGUI图片实现进度条动画的脚本教程。
html js制作加载进度条.zip
loading动画加载进度条效果是一款纯css3 animation动画属性页面loading动画加载进度条效果。
加载loading进度条的demo,亲测直接可用哦亲...
css3 iOS8风格loading加载进度条动画
Canvas制作圆形进度条Loading效果
正在缓冲,loading加载进度条ppt特效,漂浮的气泡动态ppt特效模板下载。
基于jQuery实现的myProgress.js加载loading动画进度条效果基于jQuery实现的myProgress.js加载loading动画进度条效果
Loading网页加载进度条动画效果是一款基于jquery CSS3 animation属性实现的酷炫的Loading网页加载进度条动画效果。
css3彩色loading加载进度条动画特效,本例有3种漂亮的网页加载进度条样式,具体效果请查看演示。
Flash制作的Loading下载进度条,包含Fla文件,蓝色的圆圈一直转^-^
总结一下loading进度条的使用简单总结一下。 一、说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验。 二、圆形进度条,...
圆形进度条和圆形loading源码,仅供大家学习,望大家多多支持
jQ带Loading进度条焦点图 jQuery带Loading进度条焦点图.zip
这个html5 loading效果中共有13种不同风格效果的加载动画loading效果进度条,支持ajax loading。第一款是youtube风格loading效果,完成这个demo用到了html5 svg和css3技术。
Java 编写进度条的例子源代码,作为程序运行状态的进度指示,大部分程序启动或中间处理时都会有一个Loading进度条,通过本源码您可了解下制作进度条时可显示的字符串、学习如何设置进度条边框、显示位置、将进度条...