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

所属分类: 软件教程 / 编程开发 阅读数: 703
收藏 0 赞 0 分享

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

更多精彩内容其他人还在看

parse_url函数解析

  描述  array parse_url ( string url )      此函数返回一个关联数组,包含现有 URL 的各种组成部分。如果缺少了其中的某一个,则不会为这个组成部分创建数组项。组成部分为:      scheme - ...
收藏 0 赞 0 分享

visualstudio2019怎么连接并使用VSTS?

visualstudio2019怎么连接并使用VSTS?visual studio 2019使用的时候,想要连接visual studio team service,该怎么操作呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

vscode怎么规范代码? vscode代码格式化的教程

vscode怎么规范代码?vscode编程开发的时候,发现代码很轮,想要自动格式化代码,该怎么操作呢?下面我们就来看看vscode代码格式化的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

Sublime Text英文字母大小写怎么切换?

Sublime Text英文字母大小写怎么切换?Sublime Text中编程开发的时候,想要切换英文大小写,该怎么切换呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

CodeBlocks(vc开发工具)的入门使用教程

今天起我们将加大对其他编译器学习的支持,对于训练场中的题目,我们极力建议大家以CodeBlocks作为编程工具,因为VC6的种种问题及与训练场判题系统标准的不符,导致不少新同学被坑不少
收藏 0 赞 0 分享

Sublime代码编辑器怎么重新打开编码?

Sublime代码编辑器怎么重新打开编码?Sublime代码编辑器之前变价的编码想要打开,该怎么打开呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

vb怎么将年表分成四份季度表?

vb怎么将年表分成四份季度表?visual basic中的一个表想要分成多分表,该怎么实现呢?我们可以使用代码实现,下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

VB怎么编写给表格快速添加批注的代码?

VB怎么编写给表格快速添加批注的代码?想要给表格中的数据添加批注,我们可以使用vb代码来实现,下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

UltraEdit怎么修改选中文本的颜色?

UltraEdit怎么修改选中文本的颜色?UltraEdit编程开发的时候,想要修改文本的颜色,该怎么修改选中文本的颜色呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

ueditor编辑器怎么修改复制粘贴文档源代码的字体?

ueditor编辑器怎么修改复制粘贴文档源代码的字体?ueditor复制来的代码想要编辑一下,该怎么设置代码字体大小呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多