52.网络通信-Unity网络类-WWW类
52.1 知识点
WWW 类的作用
命名空间:
UnityEngine
作用:WWW 类是 Unity 提供给我们用于简单访问网页的类,可以通过该类进行数据的下载和上传。在使用 HTTP 协议时,默认的请求类型是 Get,如果需要进行 Post 上传,则需要配合后续学习的 WWWForm 类一起使用。
主要支持的协议:
http://
和https://
:超文本传输协议。ftp://
:文件传输协议(仅限于匿名下载)。file://
:本地文件传输协议,可用于异步加载本地文件(PC、iOS、Android 都支持)。
注意
- 该类一般配合协程使用。
- 在较新的 Unity 版本中,虽然该类会提示过时,但仍可使用。新版本已将其功能整合到 UnityWebRequest 类中。
WWW 类的常用方法和变量
WWW 类常用方法
WWW构造函数,用于创建一个WWW请求
//1.WWW:构造函数,用于创建一个WWW请求
WWW www = new WWW("http://192.168.1.101:8000/HTTPRoot/pic.png");
WWW.GetAudioClip 从下载数据返回一个音效切片AudioClip对象
//2.GetAudioClip:从下载数据返回一个音效切片AudioClip对象
//AudioClip audioClip = www.GetAudioClip()
WWW.LoadImageIntoTexture 从下载数据中的图像来替换现有的一个Texture2D对象
//3.LoadImageIntoTexture:用下载数据中的图像来替换现有的一个Texture2D对象
Texture2D texture2D = new Texture2D(100, 100);
www.LoadImageIntoTexture(texture2D);
WWW.LoadFromCacheOrDownload 从缓存加载对象,如果该包不在缓存则自动下载存储到缓存中,以便以后直接从本地缓存中加载
//4.LoadFromCacheOrDownload:从缓存加载AB包对象,如果该包不在缓存则自动下载存储到缓存中,以便以后直接从本地缓存中加载
WWW.LoadFromCacheOrDownload("http://192.168.1.101:8000/HTTPRoot/test.assetbundle", 1);
WWW 类常用变量
WWW.assetBundle 如果加载的数据是 AssetBundle,则可以通过该变量直接获取加载结果。
WWW.audioClip 如果加载的数据是音效切片文件,则可以通过该变量直接获取加载结果(新版本使用 GetAudioClip 方法)。
WWW.bytes 以字节数组的形式获取加载到的内容。
WWW.bytesDownloaded 已下载的字节数。
WWW.error 返回一个错误消息,若下载期间出现错误,可通过该变量获取错误信息。
WWW.isDone 判断下载是否已完成。
WWW.movie 如果下载的是视频,则可获取一个 MovieTexture 类型结果(新版本使用 GetMovieTexture 方法)。
WWW.progress 下载进度。
WWW.text 如果下载的数据是字符串,则以字符串的形式返回内容。
WWW.texture 如果下载的数据是图片,则以 Texture2D 的形式返回加载结果。
利用 WWW 类来异步下载或加载文件
下载 HTTP 服务器上的内容
public RawImage rawImage;
IEnumerator DownLoadHttp()
{
WWW www = new WWW("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
while (!www.isDone)
{
print(www.bytesDownloaded);
print(www.progress);
yield return null;
}
print(www.bytesDownloaded);
print(www.progress);
if (www.error == null)
{
rawImage.texture = www.texture;
}
else
print(www.error);
}
StartCoroutine(DownLoadHttp());
下载 FTP 服务器上的内容(FTP 服务器需支持匿名账户)
IEnumerator DownLoadFtp()
{
WWW www = new WWW("ftp://127.0.0.1/pic.png");
while (!www.isDone)
{
print(www.bytesDownloaded);
print(www.progress);
yield return null;
}
print(www.bytesDownloaded);
print(www.progress);
if (www.error == null)
{
rawImage.texture = www.texture;
}
else
print(www.error);
}
StartCoroutine(DownLoadFtp());
加载本地内容(一般移动平台加载数据会使用该方式)
IEnumerator DownLoadLocal()
{
WWW www = new WWW("file://" + Application.streamingAssetsPath + "/test.png");
while (!www.isDone)
{
print(www.bytesDownloaded);
print(www.progress);
yield return null;
}
print(www.bytesDownloaded);
print(www.progress);
if (www.error == null)
{
rawImage.texture = www.texture;
}
else
print(www.error);
}
StartCoroutine(DownLoadLocal());
总结
- Unity 中的 WWW 类比使用 C# 中的 Http 相关类更加方便。
- 建议使用 Unity 封装好的类来处理下载和加载相关逻辑。
52.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Lesson52_网络通信_Unity网络类_WWW类 : MonoBehaviour
{
public RawImage rawImage;
void Start()
{
#region 知识点一 WWW类的作用
//WWW是Unity提供给我们简单的访问网页的类
//我们可以通过该类下载和上传一些数据
//在使用http协议时,默认的请求类型是Get,如果想要Post上传,需要配合下节课学习的WWWFrom类使用
//WWW类主要支持的协议
//1.http://和https:// 超文本传输协议
//2.ftp:// 文件传输协议(但仅限于匿名下载)
//3.file:// 本地文件传输协议,可以使用该协议异步加载本地文件(PC、IOS、Android都支持)
//我们本节课主要学习利用WWW来进行数据的下载或加载
//注意:
//1.该类一般配合协同程序使用
//2.该类在较新Unity版本中会提示过时,但是仍可以使用,新版本将其功能整合进了UnityWebRequest类(之后讲解)
#endregion
#region 知识点二 WWW类的常用方法和变量
#region WWW类常用方法
//1.WWW:构造函数,用于创建一个WWW请求
WWW www = new WWW("http://192.168.1.101:8000/HTTPRoot/pic.png");
//2.GetAudioClip:从下载数据返回一个音效切片AudioClip对象
//AudioClip audioClip = www.GetAudioClip()
//3.LoadImageIntoTexture:用下载数据中的图像来替换现有的一个Texture2D对象
//Texture2D texture2D = new Texture2D(100, 100);
//www.LoadImageIntoTexture(texture2D);
//4.LoadFromCacheOrDownload:从缓存加载AB包对象,如果该包不在缓存则自动下载存储到缓存中,以便以后直接从本地缓存中加载
//WWW.LoadFromCacheOrDownload("http://192.168.1.101:8000/HTTPRoot/test.assetbundle", 1);
#endregion
#region WWW类常用变量
//1.assetBundle:如果加载的数据是AB包,可以通过该变量直接获取加载结果,相当于自动转换成AB包,其他同理
//www.assetBundle
//2.audioClip:如果加载的数据是音效切片文件,可以通过该变量直接获取加载结果
//www.audioClip是老版本的属性 新版本使用GetAudioClip方法
//3.bytes:以字节数组的形式获取加载到的内容
//www.bytes
//4.bytesDownloaded:过去已下载的字节数
//www.bytesDownloaded
//5.error:返回一个错误消息,如果下载期间出现错误,可以通过它获取错误信息
//www.error != null
//6.isDone:判断下载是否已经完成
//www.isDone
//7.movie:如果下载的视频,可以获取一个MovieTexture类型结果
//www.movie是老版本的属性 新版本使用GetMovieTexture方法
//8.progress:下载进度
//www.progress
//9.text:如果下载的数据是字符串,以字符串的形式返回内容
//www.text
//10.texture:如果下载的数据是图片,以Texture2D的形式返回加载结果
//www.texture
#endregion
#endregion
#region 知识点三 利用WWW类来异步下载或加载文件
#region 下载HTTP服务器上的内容
StartCoroutine(DownLoadHttp());
#endregion
#region 下载FTP服务器上的内容(FTP服务器一定要支持匿名账户)
StartCoroutine(DownLoadFtp());
#endregion
#region 本地内容加载(一般移动平台加载数据都会使用该方式)
StartCoroutine(DownLoadLocal());
#endregion
#endregion
#region 总结
//Unity中的WWW类比使用C#中的Http相关类更加的方便
//建议大家使用Unity当中为我们封装好的类来处理下载、加载相关逻辑
#endregion
}
#region 知识点三 利用WWW类来异步下载或加载文件
#region 下载HTTP服务器上的内容
IEnumerator DownLoadHttp()
{
//1.创建WWW对象 这是一张图片地址
WWW www = new WWW("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
//2.就是等待加载结束 在加载期间进行逻辑处理
while (!www.isDone)
{
//每一帧执行特定的逻辑
print(www.bytesDownloaded);
print(www.progress);
yield return null;
}
print(www.bytesDownloaded);
print(www.progress);
//3.使用加载结束后的资源 假如没有报错 对图像进行赋值
if (www.error == null)
{
rawImage.texture = www.texture;
}
else
print(www.error);
}
#endregion
#region 下载FTP服务器上的内容(FTP服务器一定要支持匿名账户)
IEnumerator DownLoadFtp()
{
//1.创建WWW对象 这是一张图片地址
WWW www = new WWW("ftp://127.0.0.1/pic.png");
//2.就是等待加载结束 在加载期间进行逻辑处理
while (!www.isDone)
{
//每一帧执行特定的逻辑
print(www.bytesDownloaded);
print(www.progress);
yield return null;
}
print(www.bytesDownloaded);
print(www.progress);
//3.使用加载结束后的资源 假如没有报错 对图像进行赋值
if (www.error == null)
{
rawImage.texture = www.texture;
}
else
print(www.error);
}
#endregion
#region 本地内容加载(一般移动平台加载数据都会使用该方式)
IEnumerator DownLoadLocal()
{
//1.创建WWW对象
WWW www = new WWW("file://" + Application.streamingAssetsPath + "/test.png");
//2.就是等待加载结束
while (!www.isDone)
{
print(www.bytesDownloaded);
print(www.progress);
yield return null;
}
print(www.bytesDownloaded);
print(www.progress);
//3.使用加载结束后的资源 假如没有报错 对图像进行赋值
if (www.error == null)
{
rawImage.texture = www.texture;
}
else
print(www.error);
}
#endregion
#endregion
}
52.3 练习题
请在一个NetWWW管理器当中,封装一个基于WWW下载远程数据或加载本地数据的方法,加载完成后,通过委托的形式让外部使用
定义NetWWW管理器单例类
public class NetWWWManager : BaseSingletonInMonoBehaviour<NetWWWManager>
{
}
NetWWW管理器封装外部调用加载资源的方法,同时定义内部异步加载的方法
/// <summary>
/// 提供给外部加载资源用的方法
/// </summary>
/// <typeparam name="T">资源的类型</typeparam>
/// <param name="path">资源的路径 http ftp file都支持</param>
/// <param name="action">加载结束后的回调函数 因为WWW是通过结合协同程序异步加载的 所以不能马上获取结果 需要回调获取</param>
public void LoadResource<T>(string path, UnityAction<T> action) where T : class
{
StartCoroutine(LoadResourceAsync<T>(path, action));
}
/// <summary>
/// 内部异步使用WWW加载资源用的协程方法
/// </summary>
/// <typeparam name="T">资源的类型</typeparam>
/// <param name="path">资源的路径 http ftp file都支持</param>
/// <param name="action">加载结束后的回调函数 因为WWW是通过结合协同程序异步加载的 所以不能马上获取结果 需要回调获取</param>
private IEnumerator LoadResourceAsync<T>(string path, UnityAction<T> action) where T : class
{
//声明www对象 用于下载或加载
WWW www = new WWW(path);
//等待下载或者加载结束(异步)
yield return www;
//优化的话可以让外部多传一个在加载时逻辑处理的委托回调
//如果没有错误 证明加载成功
if (www.error == null)
{
//根据T泛型的类型 决定使用哪种类型的资源 传递给外部
if (typeof(T) == typeof(AssetBundle))
{
action?.Invoke(www.assetBundle as T);
}
else if (typeof(T) == typeof(Texture))
{
action?.Invoke(www.texture as T);
}
else if (typeof(T) == typeof(AudioClip))
{
action?.Invoke(www.GetAudioClip() as T);
}
else if (typeof(T) == typeof(string))
{
action?.Invoke(www.text as T);
}
else if (typeof(T) == typeof(byte[]))
{
action?.Invoke(www.bytes as T);
}
//自定义一些类型 可能需要将bytes 转换成对应的类型来使用
}
//如果错误 就提示别人
else
{
//优化的话可以让外部多传一个在错误时委托回调
Debug.LogError("www加载资源出错" + www.error);
}
}
测试加载图片,写入图片和打印字符
public RawImage rawImage;
void Start()
{
NetWWWManager.Instance.LoadResource<Texture>("http://192.168.1.101:8000/HTTPRoot/pic.png", (obj) =>
{
//使用加载结束的资源
rawImage.texture = obj;
});
NetWWWManager.Instance.LoadResource<byte[]>("http://192.168.1.101:8000/HTTPRoot/pic.png", (obj) =>
{
//使用加载结束的资源
//把得到的字节数组存储到本地 保存文件
print(Application.persistentDataPath);
File.WriteAllBytes(Application.persistentDataPath + "/www下载的字节数组图片.png", obj);
});
NetWWWManager.Instance.LoadResource<string>("http://192.168.1.101:8000/HTTPRoot/test.txt", (str) =>
{
print(str);
});
}
测试结果
52.4 练习题代码
NetWWWManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class NetWWWManager : BaseSingletonInMonoBehaviour<NetWWWManager>
{
/// <summary>
/// 提供给外部加载资源用的方法
/// </summary>
/// <typeparam name="T">资源的类型</typeparam>
/// <param name="path">资源的路径 http ftp file都支持</param>
/// <param name="action">加载结束后的回调函数 因为WWW是通过结合协同程序异步加载的 所以不能马上获取结果 需要回调获取</param>
public void LoadResource<T>(string path, UnityAction<T> action) where T : class
{
StartCoroutine(LoadResourceAsync<T>(path, action));
}
/// <summary>
/// 内部异步使用WWW加载资源用的协程方法
/// </summary>
/// <typeparam name="T">资源的类型</typeparam>
/// <param name="path">资源的路径 http ftp file都支持</param>
/// <param name="action">加载结束后的回调函数 因为WWW是通过结合协同程序异步加载的 所以不能马上获取结果 需要回调获取</param>
private IEnumerator LoadResourceAsync<T>(string path, UnityAction<T> action) where T : class
{
//声明www对象 用于下载或加载
WWW www = new WWW(path);
//等待下载或者加载结束(异步)
yield return www;
//优化的话可以让外部多传一个在加载时逻辑处理的委托回调
//如果没有错误 证明加载成功
if (www.error == null)
{
//根据T泛型的类型 决定使用哪种类型的资源 传递给外部
if (typeof(T) == typeof(AssetBundle))
{
action?.Invoke(www.assetBundle as T);
}
else if (typeof(T) == typeof(Texture))
{
action?.Invoke(www.texture as T);
}
else if (typeof(T) == typeof(AudioClip))
{
action?.Invoke(www.GetAudioClip() as T);
}
else if (typeof(T) == typeof(string))
{
action?.Invoke(www.text as T);
}
else if (typeof(T) == typeof(byte[]))
{
action?.Invoke(www.bytes as T);
}
//自定义一些类型 可能需要将bytes 转换成对应的类型来使用
}
//如果错误 就提示别人
else
{
//优化的话可以让外部多传一个在错误时委托回调
Debug.LogError("www加载资源出错" + www.error);
}
}
}
Lesson52_练习题
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class Lesson52_练习题 : MonoBehaviour
{
public RawImage rawImage;
void Start()
{
NetWWWManager.Instance.LoadResource<Texture>("http://192.168.1.101:8000/HTTPRoot/pic.png", (obj) =>
{
//使用加载结束的资源
rawImage.texture = obj;
});
NetWWWManager.Instance.LoadResource<byte[]>("http://192.168.1.101:8000/HTTPRoot/pic.png", (obj) =>
{
//使用加载结束的资源
//把得到的字节数组存储到本地 保存文件
print(Application.persistentDataPath);
File.WriteAllBytes(Application.persistentDataPath + "/www下载的字节数组图片.png", obj);
});
NetWWWManager.Instance.LoadResource<string>("http://192.168.1.101:8000/HTTPRoot/test.txt", (str) =>
{
print(str);
});
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com