如何用Unity加载一个jquery真实加载进度条的进度条

Unity进度条场景载入的制作思路
时间: 11:26:16
&&&& 阅读:97
&&&& 评论:
&&&& 收藏:0
标签:有两种做法,如果全部都是AssetsBundle动态载入,可以自己管控加载和释放。还有一种是借助Unity的Level(场景)。
如果直接A-B场景切换,我比较担心加载峰值过高,所以采取这种做法:A-L-B。L是进度条专用场景
第一个问题是如何检测,OnLevelWasLoaded可以判断是否新场景加载完了,并调用Application.LoadLevelAsync(...)进行加载,可以通过返回对象获取到加载进度
使用时发现一个比较奇怪的事情,当场景很小秒载的时候,加载进度条执行OnDestroy,加载进度才0.9。
而通过FixedUpdate判断加载进度是否isDone会发现,AsyncOperation的操作对象已经被释放了
但非Additive加载的情况下,新场景载入完又会销毁进度条,所以也取不到OnLevelWasLoaded的消息。
所以既不能通过OnDestroy也不能通过Update判断场景是否加载完
最终做法是把进度条做成新场景载入不释放的对象DontDestroyOnLoad(...),然后手动控制销毁即可。
这样就可以通过OnLevelWasLoaded判断是否加载完成
第二个问题是,秒载进度条速度太快,有时候0.2秒,0.3秒用户体验也不好。所以需要做一个差值,给一个最快时间限制。大体思路各人有各人的做法,这里提供一个伪代码:
var realTime = ...//真实时间0-1
var simTime = ...//模拟时间0-1
var minValue = Math.Min(realTime,simTime);
var maxValue = Math.Min(realTime,simTime);
var lerpLoading = Mathf.Lerp(minValue, maxValue, Math.Min(simTime, realTime));
//...label.text = (lerpLoading * 100).ToString();
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码![Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果 - 推酷
[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果
& & & 大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是:
。终于在各种无语的论文作业中解脱了,所以马上抓紧时间来这里更新博客。博主本来计划在
这篇文章后再写一篇《
Unity3D游戏开发之从《魂斗罗》游戏说起(下)》,不过目前博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享。作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步加载。那么什么是游戏场景异步加载呢?异步加载就是系统在加载数据(如地图数据、模型数据、玩家数据等)时可以执行其它的任务,其实就是我们熟悉的多线程啦。相反地,在单线程中,我们通常需要等待数据加载完成以后才能继续执行任务。我们可以从《仙剑奇侠传》、《古剑奇谭》等游戏中找到这样的例子。比如《仙剑奇侠传四》中的五毒兽勇气读条效果:
再比如《古剑奇谭》中融入了游戏特色介绍的读条效果:
&从上面的这些例子我们可以看出,在游戏设计中通过合理的游戏场景加载方式,减少玩家等待的时间,对于一个游戏来说是设计的时候需要好好考虑的一个问题。在Web设计中一个好的Web设计通常要考虑要将用户等待页面响应的时间降到最低,这样才不会导致用户流量的缺失。在一个注重用户体验的时代,无论设计什么样的产品,带给用户最为极致的体验才是最重要的。我们注意到这两款游戏都采用了异步加载的方式,因为在加载游戏的过程中,系统在执行界面GUI元素的绘制工作。那么,好了,在了解了异步加载的概念和异步加载的原理以后,我们就来实现今天的内容,如图是我们今天要来实现的效果图,我们希望实现在游戏加载的过程中,可以在进度条下方交替显示不同的提示内容:
& & & 那么具体怎么实现呢?在Unity3D中提供了一个LoadLevelAsync()方法,该方法可以用于异步加载场景资源。该方法返回一个&AsyncOperation类型的返回值,该返回值有两个重要的属性:1、&
isDone:可以查询是否加载完成;2、
progress:一个介于0-1之间的值,可以表示加载的进度
& & 好了,通过这两个属性和这个方法,我们就可以实现今天的内容啦,一起开始吧!
& & 首先创建一个场景,我们这里使用系统默认的GUI系统,如图:
& & &这个界面就是我们今天的加载界面,在界面加载的过程中,我们可以在背景下方显示游戏中的Tips和游戏进度。通常情况下,我们需要三个界面来完成一个完整的界面加载效果。第一个界面称为触发界面,主要负责响应用户的触发操作。第二个就是我们今天这里在讲的加载界面,主要负责读条及UI刷新。第三个界面就是我们最终要呈现给玩家的界面。这比如在《仙剑奇侠传》游戏中,当玩家靠近房屋时会在门口显示一个箭头的效果,这样可以提示玩家即将进入场景加载的触发区域,当玩家进入这个范围时,就会触发加载界面的显示,这样我们就能看到五毒兽勇气的读条效果了。当读条结束后,会进入第三个界面,这是我们最终要显示给玩家的界面。。好了,这就是异步加载游戏场景的一个完整的过程了。我们下面来编写脚本实现今天的功能,对于加载过程这个界面,我们主要用到我们的LoadLevelAsync()方法:
using UnityE
using System.C
public class Loading : MonoBehaviour {
//异步对象
private AsyncOperation mA
//绑定Tip的GUIText
private GUIText mT
//Tip集合,实际开发中需要从外部文件中读取
private string[] mTips=new string[]
&异步加载过程中你可以浏览游戏攻略&,
&异步加载过程中你可以查看当前进度&,
&异步加载过程中你可以判断是否加载完成&,
&博主不理解轩6的读条为什么那样慢&,
&难道是因为DOOM不懂Unity3D&,
void Start ()
mTip=GameObject.Find(&GUITips&).GetComponent&GUIText&();
StartCoroutine(&Load&);
IEnumerator Load()
mAsyn=Application.LoadLevelAsync(&Main&);
yield return mA
void Update ()
//如果场景没有加载完则显示Tip,否则显示最终的界面
if(mAsyn!= null && !mAsyn.isDone)
mTip.guiText.text=mTips[Random.Range(0,5)]+&(&+(float)mAsyn.progress * 100+&%&+&)&;
Application.LoadLevel(&Main&);
& & 这里的代码很好理解,如果加载完毕了就加载最终界面,否则就随机显示Tips和加载的进度。这里博主为了节省时间,使用的是前一篇文章中的场景,如图:
& & & 而对于触发加载事件的界面,我们只需要使用普通的加载方式就可以了:
using UnityE
using System.C
public class TriggerToLoad : MonoBehaviour {
void OnGUI()
if(GUILayout.Button(&加载Loading场景&,GUILayout.Height(30)))
Application.LoadLevel(&Scene2&);
& & 显然,这是一个当用户点击按钮时加载场景的方法,所以不再做太多的解释。由于这个方法只支持Pro版本的Unity3D,因此博主的免费版Unity3D注定是无法运行了,所以这里无法给大家做程序演示,希望大家谅解啊。在Unity3D异步加载场景的问题中,有两个常见的问题:
2、无法捕捉到场景加载完成的事件:使用DontDestroyOnLoad可以解决
& & 好了,今天的内容就是这样了,博主的能力有限,能够理解到的只有这么多啦,不管怎么样,还是希望能和大家一起成长啊,呵呵。
& 参考文章:
& 每日箴言:
勇者不是没有眼泪的人,而是含着眼泪微笑奔跑的人。
& &喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei。
& &转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致unity场景载入慢有多少因素是由于程序的良好习造成的?
如awake中一堆find game object
一个1W面不到dc50+的场景需要2秒以上的载入?
为何我自己试了下~~载入速度实际上才0.5秒不到(场上包括30+个角色)
但是同样的东西给程序却撑死优化到极限,2秒...还是性能极高的手机~
我的要求是~场景切换不得有进度条~必须达到瞬间切换,非特殊情况不得在初始化有任何尝试find的方法
同时所有事件必须基于触发不得每帧update用一堆脏更新来维护
然后结果就是~为何程序还是用所谓的聪明的动态获取方法让游戏载入竟然需要超过2秒?
要评论请先&或者&
如果是从本地加载会慢,你可以游戏开始的时候把资源先加载到内存并实例化好隐藏掉,需要的时候在显示,这样应该就瞬间完成了。
:如果是从本地加载会慢,你可以游戏开始的时候把资源先加载到内存并实例化好隐藏掉,需要的时候在显示,这样应该就瞬间完成了。 我想知道的是为什么程序做的载入会这么慢,这不是个例,而是目前普遍的情况同样的东西,我来做,0.5秒
:我想知道的是为什么程序做的载入会这么慢,这不是个例,而是目前普遍的情况同样的东西,我来做,0.5秒 你忘记了释放,不可能一下把所有东西都加载到内存。你说不开始find,那只有在窗口中赋值了,但这个不建议使用,突然预设坏了,那你岂不是要重新.....! &看你这口气,你不是程序员。
:你忘记了释放,不可能一下把所有东西都加载到内存。你说不开始find,那只有在窗口中赋值了,但这个不建议使用,突然预设坏了,那你岂不是要重新.....! &看你这口气,你不是程序员。 所有切换场景时都会进行GC清理和资源回收,还有在窗口中赋值目前做了2个大型3D项目5款以上普通小型项目从来没出现过一次预设坏掉
确实不是专业程序,但是独立开发3DACT也没有什么问题,所以才不知道为什么我自己做载入0.5s~然而程序做稍微慢一点的时候甚至可能要5~10秒
所以我想知道的是什么原因让大多数程序非常有共同意识的导致牺牲如此大的性能速度
特别是对于手游项目,载入速度的重要性远大于其他一切所谓的代码美观
:所有切换场景时都会进行GC清理和资源回收,还有在窗口中赋值目前做了2个大型3D项目5款以上普通小型项目从来没出现过一次预设坏掉
确实不是专业程序,但是独立开发3DACT也没有什么问题,所以才不知道为什么我自己做载入0.5s~然而程序做稍微... 不知道你们资源是否有打assetbundle,如果资源在打包的时候有压缩,解包的时候也要花点时间。窗口中赋值,一般都不建议使用。因为我们会让脚本和实际资源分开,都是动态添加脚本。
:不知道你们资源是否有打assetbundle,如果资源在打包的时候有压缩,解包的时候也要花点时间。窗口中赋值,一般都不建议使用。因为我们会让脚本和实际资源分开,都是动态添加脚本。 但是这种时候我要求是载入速度必须是瞬间的,不能看到loading条的,那么有什么办法优化?一个loading超过2秒那么严重程度可能是致命的,50%以上用户流失都有可能在这这种时候如何解决?还是继续保持这样仅仅因为程序为了动态添加自由性的一句“不建议使用”继续让游戏效率如此低下?
:但是这种时候我要求是载入速度必须是瞬间的,不能看到loading条的,那么有什么办法优化?一个loading超过2秒那么严重程度可能是致命的,50%以上用户流失都有可能在这这种时候如何解决?还是继续保持这样仅仅因为程序为了动态添加自由... 受教了,大神!
assetbundle去掉要快很多.但是没法在线更新资源,自己选择.u3d的整体性能是很低的,只有渲染性能勉强和其他引擎持平,如果对游戏性能要求很高,不建议用u3d
感觉楼上们都是理论派。。。。你们实际测试一下就会知道真真耗时的部分分为两步 一步是资源加载,一步是第一次渲染资源加载如楼主所说,可能需要1s左右,但第一次渲染是很费事的 opengl要做很多事情 手机上就更麻烦了显示架构只能排队,速度肯定比电脑上慢。所以不论你们如何做优化,1s左右卡顿的是无可避免的除非 你不但把资源准备好了 而且已经渲染过一次了 这应该只针对静态物体动态物体应该是没有办法的 如果你熟悉opengl,或许有其他办法主题 : 如何实现loading场景加入进度条?
级别: 新手上路
可可豆: 110 CB
威望: 110 点
在线时间: 19(时)
发自: Web Page
来源于&&分类
如何实现loading场景加入进度条?&&&
var LevelNum : int = 11;function Start(){&&&&async = Application.LoadLevelAsync(LevelNum);//&&&&async = Application.LoadLevelAdditiveAsync(LevelNum);&&&&}function Update(){&&&&if(!async.isDone)&&&&{&&&&&&&&print(async.progress);&&&&}else{&&&&&&&&print(async.progress);&&&&}}Start() 里面有2种方法,用第一种得话,加载到LevelNum场景得时候 load场景被删除,所以只输出!async.isDone条件下的0,第二种不删除load场景,返回的是0跟1;请教下如何用progress控制进度条实现 loading场景?或者说有更好的方法?
级别: 天使
发帖: 152456
可可豆: 2255438 CB
威望: 2255438 点
在线时间: 1740(时)
发自: Web Page
这个我记得是bug就别进度了.有个动态进度条就挺好了.
我的博客:QQ:3122828,微博:@unity3
级别: 新手上路
可可豆: 110 CB
威望: 110 点
在线时间: 19(时)
发自: Web Page
引用 引用第1楼四角钱于 18:35发表的&&:这个我记得是bug就别进度了.有个动态进度条就挺好了. 动态进度条是?请教怎么用?
级别: 精灵王
可可豆: 10855 CB
威望: 10845 点
在线时间: 4280(时)
发自: Web Page
其实unity场景load挺快。一定要的话弄个Activity Indicator意思意思就可以了。
级别: 骑士
可可豆: 2685 CB
威望: 2685 点
在线时间: 303(时)
发自: Web Page
用插件了,调用xcode得旋转圈圈,效果可以看我得有游戏,
Unity iphone
级别: 天使
发帖: 152456
可可豆: 2255438 CB
威望: 2255438 点
在线时间: 1740(时)
发自: Web Page
引用 引用第2楼wsfcxj于 18:48发表的&&:动态进度条是?请教怎么用? 就是在你这个代码ongui里画点动的东西.
我的博客:QQ:3122828,微博:@unity3
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.

我要回帖

更多关于 网页加载进度条 的文章

 

随机推荐