unity3d 加载场景游戏启动时怎样加载为上次退出时的场景

[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个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致unity3d游戏启动时怎样加载为上次退出时的场景?_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:61,567贴子:
unity3d游戏启动时怎样加载为上次退出时的场景?收藏
unity3d游戏启动时怎样加载为上次退出时的场景?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或【新人求教】关于Unity退出时保存进度_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:61,567贴子:
【新人求教】关于Unity退出时保存进度收藏
最近在研究U3D的开发,我想实现游戏退出后再次启动时启动时加载为上次退出时的场景,要怎么实现?大神们给个思路或者方法
火星时代unity3d,争当游戏大触,月薪过万小意思,手绘技能,概念设计,商业应用一步到位,你与u3d游戏特效设计师只差一步,赶快点击吧!
我的做法是把场景里的GameObject封装成prefab,然后把场景中的对象的名称,平移,旋转,缩放导出到xml,下次运行时直接解析xml,实例化prefab到场景中。第一次可以实现,再将克隆物体导出再解析,因为克隆物体与prefab名称不匹配,就不行了。不知道前面的思路对不对,或者大神给的好的建议
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或下次自动登录
现在的位置:
& 综合 & 正文
Unity3D之异步加载游戏场景中关于进度条显示
关于异步任务相信大家都不会太陌生,今天主要是把自己这两天做过的一些过程和大家进行分享,说到异步任务,肯定有同步任务,一般的同步场景加载的时候通常会用到的方法是 Application.LoadLevel("loading");但是大家是否也同时发现,同步加载的时候如果你的游戏对象相对较多的时候,场景加载速度是很慢的,就会伴有卡壳的现象出现,这样难免就会影响用户的体验效果,这就是用同步的效果。下面在介绍一下关于异步加载,异步加载分两种情况,情况一:使用以下方法application.LoadLevelAsync("ck1");情况二:使用以下方法application.LoadLevelAdditiveAsync("ck1");其实这两种方法加载的原理是一样的就是显示的效果不同罢了。要想实现进度条我们就应该新建一个专门显示进度条的场景,比如说有三个场景,在场景一中获得触发事件,先进入场景二中显示进度条,同时异步加载场景三,当场景三加载完后就进入场景三,情况一:场景二消失;情况二:场景二的对象继续执行,如下:
using UnityE
using System.C
public class loads : MonoBehaviour {
//申明异步对象
public Texture2D
public Texture2D blood_
public Texture2D blood_
public int HP = 0;
// Use this for initialization
void Start()
//StartCoroutine()
StartCoroutine(loadSence());
private IEnumerator loadSence()
async = Application.LoadLevelAsync(Golble.loadName);
async = Application..LoadLevelAdditiveAsync(Golble.loadName);
DontDestroyOnLoad(transform);
// Update is called once per frame
void Update()
if (HP & 50)
if (HP == 50)
//这里主要是进度条显示
void OnGUI()
GUI.DrawTexture(new Rect(Screen.width / 2 - 270, Screen.height/2-50, 545, 100), picturebg);
int blood_width = blood_black.width * HP / 50;
GUI.DrawTexture(new Rect(Screen.width/2-270, Screen.height/2-22, 540, 45), blood_black);
GUI.DrawTexture(new Rect(Screen.width / 2 - 265, Screen.height/2-15, blood_width, 30), blood_red);
GUI.Label(new Rect(Screen.width / 2 - 270, Screen.height / 2 - 40, 100, 30), "Loading......");
&&&&推荐文章:
【上篇】【下篇】Unity3d中制作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(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
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(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
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 scene) {
int displayProgress = 0;
int toProgress = 0;
AsyncOperation op = Application.LoadLevelAsync(scene);
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动画,然后再加载场景。总之进度条虽然小,但要做好也是不容易的。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
unity3d脚本
游戏加载进度条的脚本 using UnityE
using System.C
public class HHHHHHHH : MonoBehaviour {
public GUIStyle progressbar_ //背景图
public GUIStyle progressbar ...
今天手把手教大家用CSS3制作圆形滚动进度条动画,想不会都难!那么,到底是什么东东呢?先不急,之前我分享了一个css实现进度条效果的博客&CSS实现进度条和订单进度条&,但是呢,那篇博客只是制作出来效果而已,并没有动画效果,因为当时正期末复习期间,所以就省了制作动画的时间成本.所以,今天就一起把各种效果都实现吧! 内
背景 通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长.为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来加载主场景.因为Loading场景包含的资源较少,所以加载速度快.在加载主场景的时候一般会在Loading界面中显示一个进度条来告知玩家当前加载的进度.在Unity中可以通过调用Application.LoadLe ...
注:如果在手机上使用,进度条卡住,把yield return new WaitForEndOfFrame(); 改成 yield return new WaitForSeconds (0.01f);
通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长.为了避免这个问题,可以首先加载Loading场景,然后再通过Loa ...
今天尝试做个类似街霸中的游戏场景,头部需要显示PK双方的血条.为了达到一个对称的效果,右边的血条要从左往右减少. 展现血条首先想到的是使用ProgressBar,但是发现都是从右往左减少.google了下,没发现有资料介绍如何配置来实现从左到右变化的效果.万幸的是,我们可以看到源码.那么自己动手,丰衣足食.
一.失败的尝试 首先想到的是使用Matrix来 ...
ASP.NET中的AJAX提供了一个很酷的进度条UpdateProgress控件,它是一个很好的进度指示器.但是,如果在进度条展示的时候,页面上的其他元素都不可用或许更好些.所以,文章通过作为一个模式的弹出对话框展示进度条,从而达到我们的目的. 下载地址:/s/1nthXgZf
在Windows 8中的默认进度条也与时俱进,和之前Silverlight中的不一样.本文将讲述三种不同的进度条,另外在本文中也会将两种定时器. 进度条 主要属性: Value:当前进度值. Maximum:最大进度值. IsIndeterminate:指定进度条是否确定. 确定进度条:进度明确的进度条,已完成进度以另外一种颜色显示 关键代码: &Pr ...
圆形进度条和水平进度条
进度条也是UI界面一种非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比,进度条可以动态的显示进度,避免长时间的执行某个耗时操作时,让用户感觉程序失去了相应,从而更好的提高用户界面的友好性.
从样式来看,ProgressBar可以分为两种,一种是简单的不断旋转的圆环形状,一种是条形带进度的, ...

我要回帖

更多关于 unity3d 加载场景 的文章

 

随机推荐