目錄
- 前言
- 核心特性
- 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 詳解& 簡單封裝