思考并回答以下问题:
- 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格式如下:
**Https协议**Uri:统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。
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格式如下:
**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
23using 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类