目录
- 前言
- 核心特性
- 1. 文件保留原始格式
- 2. 只读访问
- 3. 平台兼容性
- 不同平台下的路径
- 一、使用
- 1、读写
- 2、使用UnityWebRequest读取
- 二、AB读取的特例
- 三、注意事项
前言
StreamingAssets 文件夹是Unity项目中的一个特殊目录,用于存放需要在运行时访问的资源文件。这个文件夹中的文件会被逐字复制到目标平台的特定位置,并且保持原始格式,不会被引擎进行压缩或编译。
核心特性
1. 文件保留原始格式
- 不经过处理:Unity 不会修改 StreamingAssets 中的文件
- 保持原始结构:文件夹结构和文件内容完全保留(比如图片不会被引擎进行纹理压缩)
- 适用文件类型:JSON、XML、文本、图像、视频、音频、二进制数据等
- 放置在 StreamingAssets 文件夹中的 .dll 文件 和 脚本不会参与编译;
2. 只读访问
- 运行时只读:无法在运行时修改 StreamingAssets 中的文件
- 构建后不可变:文件在构建后成为应用程序的一部分
3. 平台兼容性
- 全平台支持:支持所有 Unity 平台(PC、移动、WebGL、主机)
- 路径统一访问:通过 Application.streamingAssetsPath 获取路径
不同平台下的路径
平台 | 路径格式 | 示例 |
---|---|---|
Windows/Mac/Linux | file://[Application.dataPath]/StreamingAssets | file://C:/App/Data/StreamingAssets/data.json |
Android | jar:file://[Application.dataPath]!/assets | jar:file:///data/app/com.game.apk!/assets/data.json |
iOS | file://[Application.dataPath]/Raw | file:///var/mobile/Containers/Data/App/Raw/data.json |
WebGL | [URL]/StreamingAssets | http://localhost:8080/StreamingAssets/data.json |
通用访问 | Application.streamingAssetsPath | 跨平台访问的统一方式 |
对于android平台:
Application.streamingAssetsPath的详细格式形如:“jar:file:///data/app/包名-XXXXX/base.apk!/assets” 亦即 “jar:file://”+Application.dataPath+“!/assets”
Application.dataPath的详细格式形如:“/data/app/包名-XXXXX/base.apk”
Application.persistentDataPath的信息格式形如:“/storage/emulated/0/Android/data/包名/files”
一、使用
1、读写
-
读:对于非Android和WebGL平台,支持File或者Stream的同步读取。同时File或者Directory类的方法也都可用。
但对于Android平台和WebGL平台,对StreamingAssets目录使用File类,Direcotry类的方法,以及Stream方式的读取都不支持。
针对Android平台,如果有同步读取的需求,可以考虑在游戏运行时,把StreamingAssets下的文件写入persistentDataPath,后续的读取和写入都在persistentDataPath进行。另一种方法就是针对Android平台提供额外的jar,对StreamingAssets下的文件进行同步操作。对Android平台和WebGL平台使用UnityWebRequest(使用WWW类进行读取已废弃)对StreamingAssets下的文件进行读取,该方法是异步的。对于其它平台UnityWebRequest也是支持的。 -
写:StreamingAssets文件夹在所有平台上都 不支持写入。
访问方式对比
访问方式 | 适用平台 | 优点 | 缺点 |
---|---|---|---|
UNITY_EDITOR | #define指令,用于从游戏代码中调用Unity编辑器脚本 | 简单直接 | 不适用于WebGL和Android |
UnityWebRequest | 全平台 | 最通用方式 | 需要协程处理 |
WWW (已弃用) | 旧版Unity | 简单 | 性能差,已弃用 |
Resources.Load | 不适用 | - | 无法访问StreamingAssets |
2、使用UnityWebRequest读取
UnityWebRequest读取文件需要传入文件的URL,StreamingAssets目录不同平台对应的URL是不一样的,如下:
- Windows平台 file:///D:/DATA/StreamingAssets/data.json
- WebGl平台 http://localhost/StreamingAssets/data.json
- Android平台 jar:file:///data/app/xxx!/assets/data.json
- iOS平台 Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
这时候最好通过构造Uri()的方式来规避平台的差异,获得真正的请求URL。如:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;public class LoadStreamingAsset : MonoBehaviour
{IEnumerator Start(){string path = System.IO.Path.Combine(Application.streamingAssetsPath, "data.json");string uri = new System.Uri(path).AbsoluteUri;UnityWebRequest request = UnityWebRequest.Get(uri);yield return request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){Debug.Log(request.downloadHandler.text);}else{Debug.LogError(request.error);}}}
方法Path.Combine(path1,path2)在检测到path1不是以分隔符结尾的话,会自动补充分隔符,
二、AB读取的特例
有一个特例,就是StreamingAssets目录下的AssetBundle资源,无论什么平台,都可以通过 AssetBundle.LoadFromFile(string path) 该接口(该接口亦可读取其它具体目录中的资源,不仅仅是StremingAssets目录)同步读取。
但是对于anroid平台,path参数需要使用路径(称之为路径1)Application.dataPath + “!assets/XXXX"的格式才能读取。
其它平台path参数使用路径(称之为路径2)Application.streamingAssetsPath+”/XXXX"即可读取
(20220621补充:在较老版本Unity中,StreamingAssets目录下的AB资源若要通过AssetBundle.LoadFromFile进行读取,安卓平台上的路径确实需要使用Application.dataPath + “!assets/XXXX”(即上述删除线中提到的路径1);但经笔者测试,在Unity2020.3.20f1版本中,路径1、路径2两种方式都支持;在Unity2021.3.3f1中只支持路径2的方式)
三、注意事项
在StreamingAssets目录下,创建文件夹名字为Tables,通过jar的方式读取其内的文件,无法读取。改成其它名字即可。
参考文档:Unity StreamingAssets 详解& 简单封装