UN4L6——WWW类

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
WWW                                    //Unity提供给我们简单的访问网页的类,我们可以通过该类下载和上传一些数据
new WWW() //WWW的构造函数,用于创建一个WWW请求,传入Http或者ftp地址,或者本地地址(以file://开头)
www.GetAudioClip() //从下载数据返回一个音效切片AudioClip对象
www.LoadImageIntoTexture() //用下载数据中的图像来替换现有的一个Texture2D对象
WWW.LoadFromCacheOrDownload() //从缓存加载AB包对象,如果该包不在缓存则自动下载存储到缓存中,以便以后直接从本地缓存中加载
www.assetBundle //如果加载的数据是AB包,可以通过该变量直接获取加载结果
www.bytes //以字节数组的形式获取加载到的内容
www.bytesDownloaded //获取已下载的字节数
www.error //返回一个错误消息,如果下载期间出现错误,可以通过它获取错误信息
www.isDone //判断下载是否已经完成
www.GetMovieTexture() //如果下载的视频,可以获取一个MovieTexture​类型结果
www.progress //返回一个0~1的下载进度
www.text //如果下载的数据是字符串,以字符串的形式返回内容
www.texture //如果下载的数据是图片,就直接以Texture2D的形式返回加载结果

WWW

WWW​是Unity提供给我们简单的访问网页的类,我们可以通过该类下载和上传一些数据
在使用http协议时,默认的请求类型是Get​,如果想要Post​上传,需要配合下节课学习的WWWFrom类使用

它主要支持的协议如下:

  1. http://​和https://​ 超文本传输协议
  2. ftp://​ 文件传输协议(但仅限于匿名下载)
  3. file://​ 本地文件传输协议,可以使用该协议异步加载本地文件(PC、IOS、Android都支持)

Unity中的WWW类比使用C#中的Http、FTP相关类更加的方便,建议大家使用Unity当中为我们封装好的类来处理下载、加载相关逻辑

注意:

  1. 该类一般配合协同程序使用
  2. 该类在较新Unity版本中会提示过时,但是仍可以使用,新版本将其功能整合进了UnityWebRequest类(之后讲解)

WWW类的常用方法和变量

  • 常用方法

    1. WWW()​​:构造函数,用于创建一个WWW请求

      1
      WWW www = new WWW("http://192.168.1.106/Http_Server/下载测试.png");
    2. GetAudioClip()​​:从下载数据返回一个音效切片AudioClip对象

      1
      AudioClip clip = www.GetAudioClip();
    3. LoadImageIntoTexture()​​:用下载数据中的图像来替换现有的一个Texture2D对象

      1
      2
      Texture2D texture = new Texture2D(100, 100);
      www.LoadImageIntoTexture(texture);
    4. LoadFromCacheOrDownload()​​:从缓存加载AB包对象,如果该包不在缓存则自动下载存储到缓存中,以便以后直接从本地缓存中加载

      参数一是AB包文件地址,参数二是版本,该方法多用于Unity网页游戏上,端游或者手游一般会直接提前下载AB包准备使用

      1
      WWW.LoadFromCacheOrDownload("http://192.168.1.106/Http_Server/test.assetbundle", 1);
  • 常用属性

    1. assetBundle​:如果加载的数据是AB包,可以通过该变量直接获取加载结果

      1
      AssetBundle ab = www.assetBundle;
    2. audioClip​:如果加载的数据是音效切片文件,可以通过该变量直接获取加载结果

      注:老版本内才能使用audioClip​属性,新版已经改为了使用GetAudioClip()​获取

      1
      www.audioClip
    3. bytes​:以字节数组的形式获取加载到的内容

      1
      byte[] bytes = www.bytes
    4. bytesDownloaded​:获取已下载的字节数

      1
      int downloadBytesNum = www.bytesDownloaded;
    5. error​:返回一个错误消息,如果下载期间出现错误,可以通过它获取错误信息

      如果没有问题,它将一直为null

      1
      if (www.error != null) { }
    6. isDone​:判断下载是否已经完成

      注意,该方法不能判断下载是否出错!

      1
      if (www.isDone) { }
    7. movie​:如果下载的视频,可以获取一个MovieTexture​类型结果

      注:老版本内才能使用movie​属性,新版已经改为了使用GetMovieTexture()

      再注:其返回值MovieTexture​也是几乎淘汰的旧视频播放方案

      1
      www.GetMovieTexture()
    8. progress​:下载进度

      1
      float progress = www.progress;
    9. text​:如果下载的数据是字符串,以字符串的形式返回内容

      1
      www.text
    10. texture​:如果下载的数据是图片,就直接以Texture2D的形式返回加载结果

      1
      Texture2D tex = www.texture;

利用WWW类来异步下载或加载文件

下载HTTP服务器上的内容

使用WWW​类来异步下载文件非常简单,首先在实例化WWW​对象时传入该资源在http服务器上的地址
然后就可以使用yield return​直接返回www​对象将协程挂起,即可等到资源下载完毕后继续执行协程的逻辑
我们可以通过error​属性是否为空来判断下载是否出错,之后使用www​对象对应的方法或者属性获取资源即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public RawImage image;

void Start()
{
StartCoroutine(DownLoadHttp());
}

IEnumerator DownLoadHttp()
{
//创建WWW对象
WWW www = new WWW("http://192.168.1.106/Http_Server/下载测试.png");
//直接等待加载结束
yield return www;
//使用加载结束后的资源
if (www.error == null)
{
image.texture = www.texture;
}
}

除了直接yield return www​对象本身,还可以每帧检测是否下载完毕,期间就可以输出下载字节数与进度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public RawImage image;

void Start()
{
StartCoroutine(DownLoadHttp());
}

IEnumerator DownLoadHttp()
{
//创建WWW对象
WWW www = new WWW("http://192.168.1.106/Http_Server/下载测试.png");
//每帧检测是否下载完毕,期间可以打印下载了多少字节,下载的进度
while (!www.isDone)
{
print($"下载了{www.bytesDownloaded}字节");
print($"下载到{www.progress * 100}%");
yield return null;
}
print($"下载了{www.bytesDownloaded}字节");
print($"下载到{www.progress * 100}%");
//使用加载结束后的资源
if (www.error == null)
{
image.texture = www.texture;
}
}

image

下载FTP服务器上的内容(FTP服务器一定要支持匿名账户)

如果想要WWW​类能够访问FTP服务器上的内容,该FTP服务器一定要支持匿名账户登入!

从FTP服务器上下载内容的逻辑,基本与从Http服务器上下载内容一致,
唯一的不同就是在实例化WWW​对象时传入的地址是ftp://...​格式的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public RawImage image;

void Start()
{
StartCoroutine(DownLoadFtp());
}

IEnumerator DownLoadFtp()
{
//创建WWW对象
WWW www = new WWW("ftp://192.168.1.106/下载测试.png");
//每帧检测是否下载完毕,期间可以打印下载了多少字节,下载的进度
while (!www.isDone)
{
print($"下载了{www.bytesDownloaded}字节");
print($"下载到{www.progress * 100}%");
yield return null;
}
print($"下载了{www.bytesDownloaded}字节");
print($"下载到{www.progress * 100}%");
//使用加载结束后的资源
if (www.error == null)
{
image.texture = www.texture;
}
else
print(www.error);
}

本地内容加载(一般移动平台加载数据都会使用该方式)

该方法常用于移动平台加载本地的数据

从本地加载内容的逻辑,基本与从Http服务器和Ftp服务器上下载内容一致,
唯一的不同就是在实例化WWW​对象时传入的地址是 file:// + 本地文件路径​ 格式的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public RawImage image;

void Start()
{
StartCoroutine(DownLoadLocal());
}

IEnumerator DownLoadLocal()
{
//创建WWW对象
WWW www = new WWW("file://" + Application.streamingAssetsPath + "/本地下载测试.png");
//每帧检测是否下载完毕,期间可以打印下载了多少字节,下载的进度
while (!www.isDone)
{
print($"加载了{www.bytesDownloaded}字节");
print($"加载到{www.progress * 100}%");
yield return null;
}
print($"加载了{www.bytesDownloaded}字节");
print($"加载到{www.progress * 100}%");
//使用加载结束后的资源
if (www.error == null)
{
image.texture = www.texture;
}
else
print(www.error);
}