Unity文件操作路徑


Unity3D中的資源路徑: Application.dataPath:此屬性用於返回程序的數據文件所在文件夾的路徑。例如在Editor中就是Assets了。

Application.streamingAssetsPath:此屬性用於返回流數據的緩存目錄,返回路徑為相對路徑,適合設置一些外部數據文件的路徑。

Application.persistentDataPath:此屬性用於返回一個持久化數據存儲目錄的路徑,可以在此路徑下存儲一些持久化的數據文件。

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 從上面的3張表格,我們可以看到 dataPath和streamingAssetsPath的路徑位置一般是相對程序的安裝目錄位置,而

persistentDataPath和temporaryCachePath的路徑位置一般是相對所在系統的固定位置

簡單介紹一下unity3d中資源的處理種類(歡迎拍磚):

小匹夫遇到過的大體就是如下幾種了,Resources、StreamingAssets、AssetBundle、PersistentDataPath,下面簡單分析一下。

 

Resources:

是作為一個Unity3D的保留文件夾出現的,也就是如果你新建的文件夾的名字叫Resources,那么里面的內容在打包時都會被無條件的打

到發布包中。它的特點簡單總結一下就是:

1只讀,即不能動態修改。所以想要動態更新的資源不要放在這里。 2會將文件夾內的資源打包集成到.asset文件里面。因此建議可以放一些Prefab,因為Prefab在打包時會自動過濾掉不需要的資源,有

利於減小資源包的大小。 3主線程加載。 資源讀取使用Resources.Load()。

 

StreamingAssets:

要說到StreamingAssets,其實和Resources還是蠻像的。同樣作為一個只讀的Unity3D的保留文件夾出現。不過兩者也有很大的區別,

那就是Resources文件夾中的內容在打包時會被壓縮和加密。而StreamingAsset文件夾中的內容則會原封不動的打入包中,因此

StreamingAssets主要用來存放一些二進制文件。下面也同樣做一個簡單的總結:

1同樣,只讀不可寫。 2主要用來存放二進制文件。 3只能用過WWW類來讀取

 

AssetBundle:

簡而言之就是把prefab或者二進制文件封裝成AssetBundle文件(也是一種二進制)。但是也有硬傷,就是在移動端無法更新腳本。下

面簡單的總結下:

1是Unity3D定義的一種二進制類型。 2最好將prefab封裝成AseetBundle,不過上面不是才說了在移動端無法更新腳本嗎?那從Assetbundle中拿到的Prefab上掛的腳本是不

是就無法運行了?也不一定,只要這個prefab上掛的是本地腳本,就可以。 3使用WWW類來下載。

 

PersistentDataPath:

看上去它只是個路徑呀,可為什么要把它從路徑里面單獨拿出來介紹呢?因為它的確蠻特殊的,這個路徑下是可讀寫。而且在IOS上就

是應用程序的沙盒,但是在Android可以是程序的沙盒,也可以是sdcard。並且在Android打包的時候,ProjectSetting頁面有一個選項

Write Access,可以設置它的路徑是沙盒還是sdcard。下面同樣簡單的總結一下:

1內容可讀寫,不過只能運行時才能寫入或者讀取。 提前將數據存入這個路徑是不可行的。 2無內容限制。你可以從 StreamingAsset 中讀取二進制文件或者從 AssetBundle 讀取文件來寫入 PersistentDataPath 中。 3寫下的文件,可以在電腦上查看。同樣也可以清掉。

 

 

移動平台讀取外部文件的方法

上文小匹夫之所以要介紹Resources、StreamingAssets、AssetBundle、PersistentDataPath這四個東東,就是因為讀取外部資源的操

作所涉及到的東西無外乎這幾種。既然是用Unity3D來開發游戲,那么自然要使用Unity3D規定的操作方式,而不是我們在PC上很原始的

那種操作方式來操作咯。否則就會像本文一開始所演示的那樣,寫出移動端無法使用的很傻的代碼來。

下面小匹夫就分別實現一下利用Resources、StreamingAssets、AssetBundle來讀取的過程。

Resources:

private string _result;  // Use this for initialization  void Start () {   LoadXML("Test");  }  // Update is called once per frame  void Update () {  }  private void LoadXML(string path)  {   _result = Resources.Load(path).ToString();   XmlDocument doc = new XmlDocument();   doc.LoadXml(_result);  }  void OnGUI()  {   GUIStyle titleStyle = new GUIStyle();    titleStyle.fontSize = 20;    titleStyle.normal.textColor = new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f);    GUI.Label(new Rect(400, 10, 500, 200),  _result,titleStyle);  }

StreamingAssets:

同Resources一樣,我們要新建一個StreamingAssets的文件夾來存放我們的Test.xml文件。如圖: 不過前文已經說了,StreamingAssets文件夾內的東西並不會被壓縮和加密,而是放進去什么就是什么,所以一般是要放二進制文件的

,這里小匹夫僅僅做一個演示,各位在實際操作中切記不要直接把數據文件放到這個目錄中打包。

 

private string _result;  // Use this for initialization  void Start () {   StartCoroutine(LoadXML());  }  // Update is called once per frame  void Update () {  }  /// <summary>  /// 如前文所述,streamingAssets只能使用www來讀取,  /// 如果不是使用www來讀取的同學,就不要問為啥讀不到streamingAssets下的內容了。  /// 這里還可以使用了persistenDataPath來保存從streamingassets那里讀到內容。  /// </summary>  IEnumerator LoadXML()  {   string sPath= Application.streamingAssetsPath + "/Test.xml";   WWW www = new WWW(sPath);   yield return www;   _result = www.text;  }  void OnGUI()  {   GUIStyle titleStyle = new GUIStyle();    titleStyle.fontSize = 20;    titleStyle.normal.textColor = new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f);    GUI.Label(new Rect(400, 10, 500, 200),  _result,titleStyle);  }

AssetBundle:

來到AssetBundle,這里就和上面兩個不一樣了。首先我們要把我們的文件Test.xml打成AssetBundle文件,由於小匹夫使用的是小米3

作為測試機,所以AssetBundle的平台選擇為Andorid。

如圖,我們創建了一個AssetBundle文件,並命名為TextXML。並且按照二進制文件放入StreamingAssets文件夾中的慣例,將這個

AssetBundle文件放入StreamingAssets文件夾。

private string _result;  // Use this for initialization  void Start () {   LoadXML();  }  // Update is called once per frame  void Update () {  }  void LoadXML()  {   AssetBundle AssetBundleCsv = new AssetBundle();   //讀取放入StreamingAssets文件夾中的bundle文件   string str = Application.streamingAssetsPath + "/" + "TestXML.bundle";   WWW www = new WWW(str);   www = WWW.LoadFromCacheOrDownload(str, 0);    AssetBundleCsv = www.assetBundle;   string path = "Test";   TextAsset test = AssetBundleCsv.Load(path, typeof(TextAsset)) as TextAsset;   _result = test.ToString();  }  void OnGUI()  {   GUIStyle titleStyle = new GUIStyle();    titleStyle.fontSize = 20;    titleStyle.normal.textColor = new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f);    GUI.Label(new Rect(400, 10, 500, 200),  _result,titleStyle);  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM