Unity笔记—9(Unity常用API整理之路径及文件操作)
文章目录
前言
自学笔记,没有历史知识铺垫(省略百度部分),系列性的记录核心的实用笔记,本章主要记录Unity中路径相关限制与操作以及文件操作的几种方式一、多平台获取文件路径方法
Windows文件路径
Application.dataPath – /Assets
Application.streamingAssetsPath – /Assets/StreamingAssets
Application.persistentDataPath – C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName
Application.temporaryCachePath – C:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName
Mac文件路径
Application.dataPath – /Assets
Application.streamingAssetsPath – /Assets/StreamingAssets
Application.persistentDataPath – /Users/xxxx/Library/Caches/CompanyName/Product Name
Application.temporaryCachePath – /var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name
IOS文件路径
Application.dataPath – Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPath – Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
Application.persistentDataPath – Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePath – Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches
Android文件路径
Application.dataPath – /data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath – jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
Application.persistentDataPath – /data/data/xxx.xxx.xxx/files
Application.temporaryCachePath – /data/data/xxx.xxx.xxx/cache
二、多平台文件路径权限及功能
Application.dataPath(编辑器文件使用目录)
Unity的开发资源存储目录,一般开发编辑器功能时使用,打包后目录消失
Application.streamingAssetsPath(只读目录)
对开发时的Assets/StreamingAssets目录进行读取操作,常用来存储二进制文件,且必须在打包前将文件存放进去
场景:游戏下载后首次运行,解压该目录下的二进制文件到可读写目录中(可离线减小游戏体积)
Application. persistenDataPath(可读写持久层目录)
可以将StreamingAssets下的二进制文件解压到此处进行本地读写操作,注意IOS中,如果该目录可以被icould自动上传,如果文件过多审核可能会被拒
Application.temporaryCachePath(可读写缓存目录)
可以将StreamingAssets下的二进制文件解压到此处进行本地读写操作,IOS中许多东西可以存到这里
二、Unity关键资源文件夹解读
Resources目录
该目录下的文件会被程序压缩打包,可以使用Resources类的静态方法直接读取使用内部资源
Resources静态方法
- FindObjectsOfTypeAll: --返回对象,预制件,材质,网格,纹理等列表。它还会列出内部对象,与Object.FindObjectsOfType相反,此函数还将列出禁用的对象。
- Load: – 加载指定的对象,预制件,材质,网格,纹理等,若找不到返回null
- LoadAll: – 返回指定类型或指定文件夹下的所有对象,预制件,材质,网格,纹理等列表。
- LoadAsync: – 异步加载指定资源或文件夹下的所有资源到ResourceRequest中
- UnloadAsset: – 从内存中卸载指定资源,再次加载时不会影响之前已使用的资源
- UnloadUnusedAssets: – 从内存中卸载未使用的资源
StreamingAssets目录
该目录下的文件不会被压缩和打包,原封携带,一般存放二进制文件,使用WWW(过时)或UnityWebRequest读取
常用方法:在首次启动游戏时将资源解压并copy到可读写的目录做持久化数据交互,Application.streamingAssetsPath的路径就是该目录
【Unity】关于各个平台加载streamingAssets路径
持久层目录
该目录下的文件是是可读写.
IOS中指应用程序的沙盒
Android中指程序的沙盒或者sdcard(打包时ProjectSetting中的Write Access可以设置)
- 只有在游戏运行时才可以读写,无法提前写入数据
- 可以使用UnityWebRequest操作数据
- 可以使用File API操作数据(安卓唯一可以使用File API操作的路径)
缓存目录
该目录下的文件是可读写的.(IOS该目录不会同步到icould)
查找的文档中表示该目录的操作与持久层目录类似,具体后续实验笔记
三、资源操作
WWW
需要在协程中使用,可以加载本地资源和远程资源,支持常用的HTTP协议等,该类的方法已过时,此处简单记录其用法
WWW wWW = WWW(url);
yield return wWW;
if (wWW.error!=null)
{
Debug.Log(wWW.error);
yield break;
}
Object result = wWW.**; //**为WWW支持的多种格式如文本/图片/ab等等
UnityWebRequest
Unity 推荐的网络/文件通讯操作方案
构造
无参构造默认无上传器和下载器(无法获得响应数据体),更多有参构造,支持传入url,请求方法,downloadHandler和uploadHandler
静态属性
- kHttpVerbCREATE: – CREATE字符串,请求方法
- kHttpVerbDELETE: – DELETE字符串,请求方法
- kHttpVerbGET: – GET字符串,请求方法(默认)
- kHttpVerbHEAD: – HEAD字符串,请求方法
- kHttpVerbPOST: – POST字符串,请求方法
- kHttpVerbPUT: --PUT字符串
成员属性
-
certificateHandler: – 证书属性,为null时使用Unity的默认证书,自定义证书可参考CertificateHandler
-
disposeCertificateHandlerOnDispose: – 默认为true,如果为true时连接到UnityWebRequest的所有证书都将拥有证书处理程序(自动调用)
-
disposeDownloadHandlerOnDispose: – 默认为true,如果为true,则在调用UnityWebRequest.Dispose时,与此UnityWebRequest关联的所有DownloadHandler都会自动调用DownloadHandler.Dispose。
-
disposeUploadHandlerOnDispose: – 默认为true,如果为true,则在调用UnityWebRequest.Dispose时,与此UnityWebRequest关联的所有UploadHandler都会自动调用UploadHandler.Dispose。
-
downloadedBytes: – 返回系统已从远程服务器下载的主体数据的字节数(只读),如果UnityWebRequest没有下载处理程序,则此方法将始终返回零。
-
downloadHandler: – 默认值为null,持有对DownloadHandler对象的引用,该对象管理此UnityWebRequest从远程服务器接收的主体数据,将此属性设置为null表示此UnityWebRequest不在乎响应的正文数据;所有接收到的身体数据将被忽略并丢弃。调用Send后不能更改此属性。
-
downloadProgress: – 默认为true,如果为true,任何UploadHandler附加到此UnityWebRequest将有UploadHandler.Dispose时自动调用UnityWebRequest.Dispose被调用。如果没有UploadHandler附加到此UnityWebRequest,则此属性无效。
-
error: – 默认值为null,描述此UnityWebRequest对象在处理HTTP请求或响应时遇到的任何系统错误。(只读)如果UnityWebRequest尚未遇到系统错误,则此属性将返回null。系统错误的示例包括套接字错误,解析DNS条目的错误或超出重定向限制。
注意:
1.来自服务器的错误类型的返回码,例如404/File Not Found or 500/Internal Server Error(404 /找不到文件或500 /内部服务器错误),不被视为系统错误。
2. 与WWW的区别,UnityWebRequest不适用error作为响应是否成功的判断 -
isDone: – 返回true,在UnityWebRequest与远程服务器完成通信后返回。(只读)
UnityWebRequest成功完成或遇到系统错误时,此属性将返回true。在此属性返回之前,将完成DownloadHandler的所有下载后处理(如果有)true。
-
isHttpError: – 如果请求http错误将返回true,判断条件是响应码>=400
通常与isNetworkError一起校验请求是否成功
-
isModifiable: – UnityWebRequest配置属性可以被改变是返回true,配置属性包含 downloadHandler, method and url
-
isNetworkError: – 系统错误的示例包括无法解析DNS条目,套接字错误或重定向限制返回true,该标识无法判断http响应嘛,响应码可以根据isHttpError判断
通常与isHttpError一起校验请求是否成功
-
method: – 定义请求方法,默认GET
-
redirectLimit: – 设置重定向次数,默认32次,设置0表示拒绝重定向,负数表示不限制次数
-
responseCode: – 返回请求结果的响应码,如200/404/500 ,-1表示未处理完响应
-
result: – 请求的响应结果
-
timeout: – 设置超时时间
-
uploadedBytes: – 返回系统已上传到远程服务器的主体数据的字节数。(只读)
如果此UnityWebRequest没有上载处理程序,则此属性将始终返回0 -
uploadHandler: – 持有对UploadHandler对象的引用,该对象管理要上传到远程服务器的正文数据。将该属性设置为null表示此UnityWebRequest没有要上载的正文数据
-
uploadProgress: – 返回介于0.0到1.0之间的浮点值,指示将主体数据上传到服务器的进度。
如果UnityWebRequest完成(成功或系统错误),则此属性将始终返回1。
如果UnityWebRequest仍在与远程服务器通信,而uploadHandler为null,则此属性将返回0。
如果尚未调用发送,则此属性将返回-1。 -
url: – 请求的地址,//表示网络请求, /表示Unity本地路径请求
-
uri: – 与url相同,但验证和预处理较少,因此设置速度更快。但是,由于创建了新的Uri实例,因此读取它的值会更加昂贵,因此,如果您想获取最终请求的URL,建议使用url,除非您需要Uri对象。
-
useHttpContinue: – 默认true,确定这个UnityWebRequest是否包括Expect:100-继续在其传出的请求头中。(默认值:true)。
100 Continue响应代码旨在允许远程服务器在客户端传输完整的请求主体之前,根据请求的标头决定是否接受请求。
如果设置为true,则此UnityWebRequest将Expect: 100-Continue在初始出站请求中包含标头
如果设置为false,Expect将发送一个空的头
静态方法
- ClearCookieCache: – 清除缓存中的cookie
Cookie缓存仅存在于当前游戏会话中,下次启动游戏时将为空。下面列出了例外情况。此方法使您可以从缓存中删除cookie。如果不指定参数,则该方法将删除缓存中的所有cookie。如果确实指定了字符串参数,则该方法仅删除适用于给定URL的cookie。iOS具有系统提供的内置cookie缓存,该缓存在游戏会话之间保持不变。此方法从该内置缓存中删除cookie。在WebGL上,Cookie由浏览器管理,无法删除,因此此方法不会执行任何操作。
- Get/Post/Put/Head/Delete: – 创建不同请求方法的请求
- EscapeURL: – url字符编码器功能
- GenerateBoundary: – 生成一个包含40个随机byte的数组,一般用于表单边界之类使用
- SerializeFormSections: – 将表单数据和边界数组合起来返回byte数组流
- SerializeSimpleForm: – 将表单数据序列化为url格式参数
- UnEscapeURL: – url字符解码器功能
成员方法
- Abort: – 立刻终止请求
isNetworkError返回true
isHttpError返回true
error返回"User Aborted" - Dispose: – 表示不再使用此UnityWebRequest,并应清除其正在使用的所有资源。无论成功还是失败都需要调用
- GetRequestHeader: – 获取请求头信息
- GetResponseHeader: – 获取响应头信息
- GetResponseHeaders: – 获取响应头信息列表
- SetRequestHeader: – 设置请求头
- SendWebRequest: – 发送请求,在每个实例只能调用一次,调用后无法修改实例的部分配置(核心方法)
//网络请求
private IEnumerator LoadDony15() {
UnityWebRequest requestClient = UnityWebRequest.Get("https://dony15.cn/");
yield return requestClient.SendWebRequest();
if (requestClient.isNetworkError || requestClient.isHttpError)
{
Debug.Log(requestClient.error);
yield break;
}
else {
Debug.Log(requestClient.downloadHandler.text);
}
requestClient.Dispose();
}
//本地文件
private IEnumerator LoadLocalText() {
string path = Path.Combine(Application.streamingAssetsPath, "test.txt");
UnityWebRequest requestClient = UnityWebRequest.Get(path);
yield return requestClient.SendWebRequest();
if (requestClient.isNetworkError || requestClient.isHttpError)
{
Debug.Log(requestClient.error);
}
else
{
Debug.Log(requestClient.downloadHandler.text);
}
requestClient.Dispose();
}
System.IO.File
需要与Unity中的UnityEngine.Windows.File(win平台的文件操作)区别开,二者不是一个东西
-
File.Exists(@“路径”): – 判断文件是否存在,返回一个bool值
-
File.Move(@“路径1”,@“路径2”): – 移动文件到指定位置(可改名)
-
File.Copy(@“路径1”,@“路径2”): – 复制文件到指定位置(可改名)
-
File.Delete(@“路径”): – 删除文件
-
File.Create(@“路径”): – 创建文件
-
File.ReadAllLines(@“路径”): – 读取一个文本文件,返回一个字符串数组
-
File.ReadAllText(@“路径”): – 读取一个文本文件,返回一个字符串
-
File.ReadAllBytes(@“路径”): – 读取一个文件,返回字节数组
-
File.WriteAllLines(@“路径”): – 将一串字符串数组写入到一个文本文件,会覆盖源文件。
-
File.WriteAllText(@“路径”): – 将一串字符串写入到一个文本文件中,会覆盖源文件。
-
File.WriteAllBytes(@“路径”): – 将一个字节数组写入到一个文本文件中,会覆盖源文件。
-
File.AddAllText(@“路径”): – 将一个字符串写入到一个文本文件中,不会覆盖源文件。
-
File.AddAllLines(@“路径”): – 将一串字符串数组写入到一个文本文件,不覆盖源文件。
-
File.AddAllBytes(@“路径”): – 将一个字节数组写入到一个文本文件中,不覆盖源文件。
-
更多方法查看源码即可,与大多数编程语言的文件操作类似
//Encoding.Default使用系统默认编码
string[] str = File.ReadAllLines(@"path\test.txt",Encoding.Default);
//将一个任意类型的文件复制到其他位置
byte[] bt = File.ReadAllBytes(@"path\test.txt");
File.WriteAllBytes(@"path2\test.txt",bt);
System.IO.FileInfo
查看源码即可,与File方法类似,通过方法名即可了解如何使用
File和FileInfo比较
File类是静态类
优点:调用简单,建议简单操作以及调用次数少时使用
缺点:始终消耗CPU资源FileInfo类是实例类
优点:调用完就释放CPU资源,建议对一个文件进行大量的操作或者封装时使用
缺点:操作复杂
四、AssetsBundle
资源捆绑包,又称AB包
1.减小下载包的提及
2.远程版本迭代,bug更新
详细AB的分组规范/打包/载入使用方法后续单独学习记录
Unity AssetsBundle从入门到精通
AssetsBundle分组策略总结
五、相关干货贴
总结
本章主要记录路径相关限制与操作以及文件操作的几种方式