Unity資源載入路徑及載入方式小結
Unity3D中的資源路徑
路徑屬性 | 路徑說明 |
---|---|
Application.dataPath | 此屬性用於返回程式的資料檔案所在資料夾的路徑。例如在Editor中就是Assets了。 |
Application.streamingAssetsPath | 此屬性用於返回流資料的快取目錄,返回路徑為相對路徑,適合設定一些外部資料檔案的路徑。放在Unity工程StreamingAssets資料夾中的資源釋出後都可以通過這個路徑讀取出來。 |
Application.persistentDataPath | 此屬性用於返回一個持久化資料儲存目錄的路徑,可以在此路徑下儲存一些持久化的資料檔案。 |
Application.temporaryCachePath | 此屬性用於返回一個臨時資料的快取目錄。 |
Unity3D中的資源的處理種類
Unity中的資源資源的處理種類大致分為:Resources、StreamingAssets、AssetBundle、PersistentDataPath 四類。
Resources
是作為一個Unity的保留資料夾出現的,也就是如果你新建的資料夾的名字叫Resources,那麼裡面的內容在打包時都會被無條件的打到釋出包中。
特點:
- 只讀,即不能動態修改。所以想要動態更新的資源不要放在這裡。
- 會將資料夾內的資源打包整合到.asset檔案裡面。因此建議可以放一些Prefab,因為Prefab在打包時會自動過濾掉不需要的資源,有利於減小資源包的大小。
- 資源讀取使用Resources.Load()。
StreamingAssets
StreamingAssets和Resources很像。同樣作為一個只讀的Unity3D的保留資料夾出現。不過兩者也有很大的區別,那就是Resources資料夾中的內容在打包時會被壓縮和加密。而StreamingAsset資料夾中的內容則會原封不動的打入包中,因此StreamingAssets主要用來存放一些二進位制檔案。
特點:
- 只讀不可寫。
- 主要用來存放二進位制檔案。
- 只能用過WWW類來讀取。
AssetBundle
AssetBundle就是把prefab或者二進位制檔案封裝成AssetBundle檔案。
特點:
- 是Unity3D定義的一種二進位制型別。
- 使用WWW類來下載。
PersistentDataPath
這個路徑下是可讀寫。而且在IOS上就是應用程式的沙盒,但是在Android可以是程式的沙盒,也可以是sdcard。並且在Android打包的時候,ProjectSetting頁面有一個選項Write Access,可以設定它的路徑是沙盒還是sdcard。
- 內容可讀寫,不過只能執行時才能寫入或者讀取。 提前將資料存入這個路徑是不可行的。
- 無內容限制。你可以從 StreamingAsset 中讀取二進位制檔案或者從 AssetBundle 讀取檔案來寫入 PersistentDataPath 中。
- 寫下的檔案,可以在電腦上檢視。同樣也可以清掉。
- 需要使用WWW類來讀取。
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 |
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 |
資原始檔的讀取
接下來我們來介紹一下Resources、StreamingAssets、AssetBundle、PersistentDataPath這四個東東的讀取方法。
Resources
首先我們新建一個Resources目錄,並且並將資源放在這目錄中。如圖:
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using UnityEngine; using System.Collections; using UnityEngine.UI; public class LoadResources : MonoBehaviour { public Image image; // Use this for initialization void Start () { image.overrideSprite = Resources.Load ("animotiong_2", typeof(Sprite)) as Sprite; } } |
StreamingAssets
首先我們新建一個StreamingAssets目錄,並且並將資源放在這目錄中。如圖:
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | using UnityEngine; using System.Collections; public class LoadResources : MonoBehaviour { string _result; // Use this for initialization void Start () { StartCoroutine(LoadXML()); } IEnumerator LoadXML() { string sPath= Application.streamingAssetsPath + "/test.xml"; WWW www = new WWW(sPath); yield return www; _result = www.text; } } |
PersistentDataPath
之前我們說過,內容可讀寫,不過只能執行時才能寫入或者讀取。 提前將資料存入這個路徑是不可行的。也就是說,PersistentDataPath是在執行時生成的,例如通過網路下載資源存在放PersistentDataPath中。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; using System.Collections; public class LoadResources : MonoBehaviour { string _result; // Use this for initialization void Start () { StartCoroutine(LoadXML()); } IEnumerator LoadXML() { string sPath= Application.persistentDataPath + "/test.xml"; sPath = "file://" + sPath; WWW www = new WWW(sPath); yield return www; _result = www.text; } } |
這載入方式看起來與StreamingAssets很相識,但是注意這裡多了行sPath = "file://" + sPath;
這很重要!!想要通過WWW類載入PersistentDataPath必須使用file://協議實現載入。