UNITY_資源路徑與加載外部文件
UNITY_資源路徑與加載外部文件
https://www.tuicool.com/articles/qMNnmm6
https://blog.csdn.net/appppppen/article/details/51396256
https://zhidao.baidu.com/question/1111619840086129059.html
背景:
有許多靜態數據是放在客戶端中的,比如csv/xml文件,是需要動態讀取文件的
實例: 動態讀取一個xml文件,並生成一個類
<?xml version="1.0" encoding="UTF-8"?> <test> <name>chenjd</name> <blog>http://www.cnblogs.com/murongxiaopifu/</blog> <organization>Fanyoy</organization> <age>25</age> </test>
將此xml文件隨意放在某路徑下:Assets/aa/bb/Test.xml
使用代碼讀取文件內容
void Start() { XElement result = LoadXML("Assets/aa/bb/Test.xml"); }void LoadXML(string path) { XElement xml = XElement.Load(path); return xml; }
讀取成功。
問題1. 路徑和地址。在移動端是找不到文件的。
問題2. 使用的是PC上傳統的一套讀取資源的做法,而沒有使用unity3d提供的方法。
可能導致找得到文件但是沒能正確地讀取文件內容
移動平臺的資源路徑:
Application.dataPath: 程序的數據文件所在文件夾。在Editor中就是Assets
安卓: /data/app/xxx.xxx.xxx.apk
iOS: Application/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPath: 流數據的緩存目錄,為相對路徑,適合設置一些外部數據文件
安卓: jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
iOS: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
Application.persistentDataPath: 持久化數據存儲目錄的路徑,可用於存儲一些持久化的數據文件
安卓: /data/data/xxx.xxx.xxx/files
iOS: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePath: 臨時數據的緩存目錄
安卓: /data/data/xxx.xxx.xxx/cache
iOS: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches
dataPath和streamingAssetsPath一般是相對程序的安裝目錄位置
persistentDataPath和temporaryCachePath一般是與系統有關的固定位置
那麽,打包之後的資源的路徑如何與這些地址對應上呢?
Unity中的資源處理種類:
Resources:
如果有文件夾名為Resources,則裏面的內容會無條件地在打包時打包集成到.asset文件中
可以放置一些Prefab,因為Prefab在打包時會自動過濾掉不需要的資源,有利於減小資源包
1. 只讀。不能動態修改,會動態更新的資源不要放在這裏
2. 主線程加載
3. 使用Resources.Load()加載資源
StreamingAssets:
與Resources類似
區別為:Resources文件夾中的內容在打包時會被壓縮和加密,而StreamingAssets中的內容則原封不動地打包
一般用來存放一些二進制文件
1. 只讀,不能動態修改
2. 主要存放二進制文件
3. 只能通過WWW類讀取
AssetBundle:
將prefab或二進制文件封裝成AssetBundle文件(也是二進制文件)
缺點: 在移動端無法更新腳本
總結:
1. 該二進制文件(AssetBundle文件) 是Unity3D定義的一種二進制類型
2. 最好將Prefab封裝成AssetBundle,但是在移動端無法更新腳本
3. 使用WWW類讀取
PersistentDataPath:
這是一個路徑(可讀寫)
在iOS上就是應用程序的沙盒;
在安卓上可以是程序的沙盒或sdCard -- 在安卓打包時,ProjectSetting的選項WriteAccess可設置路徑是沙盒還是sdcard
總結:
1. 內容在運行時可讀寫,提前將數據存入這個路徑是不可行的
2. 無內容類型的限制
3. 寫下的文件可以在電腦上查看,同樣也可以在電腦中清除
移動平臺讀取外部文件的方法:
使用Unity3D規定的操作方式來讀取外部資源:Resources/ StreamingAssets/ AssetBundle
Resources:
新建Resources目錄,在目錄中創建文件Test.xml(之前在背景中提到的那個文件)
通過Resources的方法來讀取Test.xml中的內容。
public class Test: MonoBehaviour { private string _result; void Start(){ LoadXML("Test"); } private void LoadXML(string path){ _result = Resources.Load(path).ToString(); XmlDocument doc = new XmlDocument(); doc.LoadXml(_result); } }
StreamingAssets:
新建StreamingAssets文件夾並存放Test.xml文件
(StreamingAssets文件夾中的文件不會被壓縮或加密,所以一般是要放二進制文件的,這裏放xml只是做一個演示,實際操作中切記不要直接把數據文件放到該目錄中)
public class Test : MonoBehaviour { private string _result; void Start(){ StartCoroutine(LoadXML()); } IEnumerator LoadXML(){ string path = Application.streamingAssetsPath; WWW www = new WWW(path); yield return www; _result = www.text; } }
AssetBundle:
UNITY_資源路徑與加載外部文件