UnityWebRequest入门

思考并回答以下问题:

  • Android平台上的StreamingAssets路径是只读的,无法使用File类来读取。那怎么办?

之前学习了文件读写以及一些常见的数据交换格式,都是用的File类进行的读写。但有一些只读的文件只能用UnityWebRequest的方式读取到,现在学习一下UnityWebRequest如何使用。

UnityWebRequest支持多种协议。

Unity中只读文件的读取

之前在Unity中读取文件都是使用的File类,但是在Android平台上的StreamingAssets路径是只读的,无法使用File类来读取。此外在WebGL平台上,无法使用File类来读写文件(因为在WebGL平台上,所有文件都是存在服务器上,通过浏览器下载下来后在本地运行,浏览器基于安全考虑,无法在浏览器本地读写文件)。

那这种情况下如何读取外部文件呢?比如要加载一个配置文件,如何读取呢?

这时候就要用到UnityWebRequest类(原WWW类,WWW类虽然现在还可以使用,但已经被标记为遗弃,建议学习使用新的UnityWebRequest类)。

UnityWebRequest

UnityWebRequest支持http、https、file、和匿名ftp协议的请求以及处理。

http、https和匿名ftp协议用于请求服务器上的数据,file协议用于请求本地的文件数据。

协议简介

什么是协议?

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。

为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。

**Http协议**

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)。

通常一个Http协议的Uri格式如下:

http://www.baidu.com/

Uri:统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。

**Https协议**

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。

通常一个Http协议的Uri格式如下:

https://www.baidu.com/

**file协议**

File协议主要用于访问本地计算机中的文件,就如同在Windows资源管理器中打开文件一样。

通常一个file协议的Uri格式如下:

file:///D:/Work/2018/BigTalkUnity2018/Projects/201UnityWebRequest/Assets/StreamingAssets/data.json

**ftp协议**

文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。

在传输文件时,FTP客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP协议与操作系统无关,任何操作系统上的程序只要符合FTP协议,就可以相互传输数据。

通常一个ftp协议的Uri格式如下:

ftp://test:test@192.168.0.1:21/profile

**anonymous FTP(匿名FTP)**

即匿名文件传输协议。用于对远程计算机的连接,这些计算机是作为匿名或客户用户进行连接的,以将公共文件传输到用户的本地计算机。

互联网中有很大一部分FTP服务器称为“匿名”FTP服务器。这类服务器的目的是向公众提供文件拷贝服务,不要求用户事先在该服务器进行登记注册,也不用取得FTP服务器的授权。

通常一个匿名ftp协议的Uri格式如下:

ftp://192.168.0.1:21/profile

使用file协议请求文件数据

本地文件读取除了使用File类之外,还可以用UnityWebRequest来获取。

UnityWebRequest获取文件数据的基本代码如下(获取了StreamingAssets目录下的data.json文件):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;

public class GetFileByWebRequest : MonoBehaviour
{
IEnumerator Start()
{
var uri = new System.Uri(Path.Combine(Application.streamingAssetsPath, "data.json"));
var request = UnityWebRequest.Get(uri.AbsoluteUri);
yield return request.SendWebRequest();

if (request.isNetworkError || request.isHttpError)
{
Debug.Log(request.error);
}
else
{
Debug.Log(request.downloadHandler.text);
}
}
}

总结

上面的代码中有几个没见过的新东西,后面会逐一详细学习:

  • 协程Coroutine(IEnumerator,yield关键字)
  • Uri类
  • UnityWebRequest类
0%