Unity3D 使用 WWW 加载场景并显示进度条

Unity3D 加载场景有很多种方式,做一些小的 DEMO 的时候往往是直接使用 Application.LoadLevel 或者 Application.LoadLevelAsync 函数加载场景,具体可查看(http://www.xuanyusong.com/archives/1427),但是这种办法不适合在真正的 Unity3D 开发中,因为前一种需要把所有的场景都打包,这在某些情况下是不现实的,比如开发页游,我们不可能把所有的场景都打包让用户下载,我们需要一个场景一个场景的加载,这时候我们可以使用 WWW 先通过 HTTP 加载场景到本地缓存,然后再使用 Application.LoadLevel 或者 Application.LoadLevelAsync 函数加载场景,使用这种加载方式,不仅不需要 Build Settings -> Add Current 处理加载场景,进度条的显示也更加容易,但是使用这种方式,需要先把场景打包成 unity3d(查看详情) 或者 assetbundle(查看详情) 文件。

先把测试场景搭建好,如图:

然后添加一个 C# 脚本,取名 UseWww.cs,全部代码如下:

复制代码

代码如下:

using UnityEngine;
using System.Collections;
public class UseWww : MonoBehaviour
{
public UISlider progressBar;
public UILabel lblStatus;
private WWW www;
private string scenePath;
void Awake()
{
this.scenePath = "file:///" + Application.dataPath + "/Assets/MainScene.unity3d";
// 开始加载场景
this.StartCoroutine (this.BeginLoader ());
}
void Update()
{
if (this.www != null && this.progressBar != null && !this.www.isDone)
{
// 更新进度
this.progressBar.value = this.www.progress;
}
}
private IEnumerator BeginLoader()
{
this.lblStatus.text = "场景加载中,请稍候。。。";
// 加载场景使用 WWW.LoadFromCacheOrDownload,函数,这样加载完成才能使用 Application.LoadLevel 或者 Application.LoadLevelAsync
this.www = WWW.LoadFromCacheOrDownload (scenePath, Random.Range(0, 100));
yield return this.www;
if(!string.IsNullOrEmpty(this.www.error))
{
this.lblStatus.text = "场景加载出错!";
}
if (this.www.isDone)
{
this.lblStatus.text = "场景正在初始化,请等待。。。";
Application.LoadLevelAsync("MainScene");
}
}
}

然后把这个脚本挂载到游戏场景的一个对象中,设置好相关属性,如图:

运行我们的游戏,可以查看进度条的加载情况,当加载完成,自动跳转到下一个场景中,如图:

因为前面我封装了一个 WWW 加载管理器(查看详情),我们可以直接拿来使用,我们建立一个新的 C# 脚本,取名 UseWwwLoaderManager.cs,全部代码如下:

复制代码

代码如下:

using UnityEngine;
using System.Collections;
public class UseWww : MonoBehaviour
{
public UISlider progressBar;
public UILabel lblStatus;
private WWW www;
private string scenePath;
void Awake()
{
this.scenePath = "file:///" + Application.dataPath + "/Assets/MainScene.unity3d";
// 开始加载场景
this.StartCoroutine (this.BeginLoader ());
}
void Update()
{
if (this.www != null && this.progressBar != null && !this.www.isDone)
{
// 更新进度
this.progressBar.value = this.www.progress;
}
}
private IEnumerator BeginLoader()
{
this.lblStatus.text = "场景加载中,请稍候。。。";
// 加载场景使用 WWW.LoadFromCacheOrDownload,函数,这样加载完成才能使用 Application.LoadLevel 或者 Application.LoadLevelAsync
this.www = WWW.LoadFromCacheOrDownload (scenePath, Random.Range(0, 100));
yield return this.www;
if(!string.IsNullOrEmpty(this.www.error))
{
this.lblStatus.text = "场景加载出错!";
}
if (this.www.isDone)
{
this.lblStatus.text = "场景正在初始化,请等待。。。";
Application.LoadLevelAsync("MainScene");
}
}
}

然后我们把原先的脚本从场景移除,挂载这个新的脚本,如图:

运行游戏,可以看到与上面同样的加载效果。

百度网盘下载地址:http://pan.baidu.com/s/1hq7pgd2 密码: lc4y

(0)

相关推荐

  • Unity3D:异步加载场景资源进度条

    Unity3D中很多时候需要用到异步加载场景或资源.如异步打开一个非常大的场景;两个场景之间的一个过渡;游戏关卡的加载等等,通过添加一个进度条场景的方式可以很好的增强客户体验,并让客户了解场景的加载进 ...

  • 皮皮高清影视显示分类信息加载中无法显示怎么办

    皮皮高清影视显示分类信息加载中无法显示解决办法:右键IE图标→属性→(internet临时文件)删除文件→弹出对话框中勾选"删除所有脱机文件"→确定→确定. 迷你页,即播放器右侧的 ...

  • CentOS启动系统不显示进度条如何解决?

    测试版本为:Centos6.6 编辑启动grub配置文件: # vi /boot/grub/grub.conf  或   /etc/grub.conf   软连接文件,2个文件内容是一样的. 删除ke ...

  • 在PP视频播放器全屏时怎么设置显示进度条和时间

    我们在PP视频播放器播放节目或视频文件时,想要在全屏模式下,设置显示进度条和时间,以便查看播放进度和剩余播放时间,该怎么操作呢?今天就跟大家介绍一下在PP视频播放器全屏时怎么设置显示进度条和时间的具体 ...

  • 网页中的视频怎么取消显示进度条

    我们在给网页中的视频截图的时候,不希望显示出视频的进度条,该怎么操作呢?今天就跟大家介绍一下网页中的视频怎么取消显示的进度条的具体操作步骤.1. 首先打开电脑上的浏览器,进入主页面后,在上方的地址栏输 ...

  • 取消Office Word2007加载时的“配置进度”

    Office2007无论是功能还是性能上都比Office2003强大许多,但是通过这几天的使用发现Office2007还是有点缺陷,就是启动速度太慢了.每打开个Word文件都会提示什么:"配 ...

  • 显示进度条有什么用

    现在我们大家都已经习惯在产品中需要长时间等待的界面上给用户显示一个进度条了。但是这样做有什么好处吗?有人可能认为提供进度条使我们的产品更“人性化”,这没有错,但为什么有进度条会让人感觉更加“人性化”呢 ...

  • 怎么在excel单元格中按百分比显示进度条/柱形图

    直奔主题吧,对比下面两幅图中红色方框里的数据,哪一种更让你一目了然呢,很显然,是带有柱状进度条的那一幅可以一下子看出各行所占的比例等.那么怎么做出这种效果呢? 操作方法 01 我们先来观察一下最终效果 ...

  • 加载,一个被忽略的模块

    什么是加载?用户在客户端的界面上进行操作,客户端发送请求到服务器,服务器处理请求,返回数据并显示给用户.简单的说就是用户与产品的每次互动时的等待时间. 目录 一.什么是加载? 二.加载的设计样式 三. ...