移動平臺動態讀取外部文件全解析

Babybus-u3d技術交流-移動平臺動態讀取外部文件全解析

[ 移動平臺動態讀取外部文件全解析

前言:

一直有個想法,就是把工作中遇到的坑通過自己的深挖總結成一套相同[問題
的解決方案供各位同行拍磚探討。眼瞅著2015年第一個工作日就要來到了,小匹夫也休息的差不多了,尋思著也該寫點東西活動活動大腦和手指了。那么今天開始,小匹夫會記錄一些平時工作中遇到的坑,以及小匹夫的應對方法,歡迎各位拍磚討論。那么今天主要討論一下[unity
3D在移動端如何動態的讀取外部文件,比如csv(txt),xml一類的文件。主要涉及的問題,就是PC端上本來測試的好好的東西,到了移動端就不能用了,所以要討論一下PC端和移動端的區別,那么下一個問題自然而然的就是移動端的資源路徑(要討論一下Resources、StreamingAssets、AssetBundle、PersistentDataPath),最后一步就是找到了資源如何讀取(這里也會具體到對應的幾種情況,即Resources、StreamingAssets、AssetBundle),主要的思路就是這樣啦。對嘞,前言部分還是要祝各位看官新的一年身體健康,升職加薪。假如我想在editor里動態讀取文件

實際的游戲開發中,其實有相當一部分靜態數據是可以放在客戶端的,所以勢必會產生要動態讀取這些文件的需求,比如csv(其實就是文本文件),xml等等。我相信大家不管是用win還是用mac來做[unity3d
的開發,都一定要先在editor中去實現基本的功能,在具體到各個移動平臺上去調試。所以作為要讀取外部文件的第一步,顯然我們要先在editor也就是pc上實現這個功能。下面給各位舉一個讀取xml的例子,也是我在以前的一篇文章《自己動手之使用反射和泛型,動態讀取XML創建類實例并賦值》中使用過的,動態讀取一個xml文件并動態生成一個類。下面是我們用來做例子的xml文件,Test.xml:
[XML] *純文本查看
*復制代碼



<?xmlversion="1.0"encoding="UTF-8"?>
<test>   
<name>chenjd</name>   
<blog>http://www.cnblogs.com/murongxiaopifu/</blog>   
<organization>Fanyoy</organization>   <age>25</age>
</test>

我們就可以很任性的把這個文件隨便丟在一個地方,只要你能指定對它的地址。例如我還把它放在那篇文章中的地址Assets/xml-to-egg/xml-to-egg-test/

文件夾下(的確很任性)
下面我們實現在PC上讀取這個文件內容的代碼:

[C#] *純文本查看
*復制代碼


//讀取xml測試

using UnityEngine;

using System.Collections;

using EggToolkit;

using System.Xml.Linq;

public class Test : MonoBehaviour { 
    // Use this for initialization    
void Start () {        
XElement result = LoadXML("Assets/xml-to-egg/xml-to-egg-test/Test.xml");
//任性的地址        
Debug.Log(result.ToString());    
}

    
 
    // Update is called once per frame

    void Update () {
    
                         }
 private XElement LoadXML( string path)    
  {        
   XElement xml = XElement.Load(path);
   return xml;
  }

}

結果如下:

結果是讀取成功了。但是你以為到這一步就成功了,那就錯了。因為這樣的代碼到移動端是行不通的,至少2處可以被罵sb:
醉人的地址,地址參數那樣寫就不用考慮跨平臺了。所以這個sb點引出的問題就是在移動端unity3d找不到目標文件

使用的還是pc上傳統的一套讀取資源的做法,沒有使用unity3d提供的方法,所以可能導致的問題是找得到文件但是沒有正確的讀取文件內容

以上用紅色標出的問題,便是小匹夫想到的可能出現的問題,也是下文要討論的內容。那么我們首先來看看資源路徑在各個平臺上的不同之處吧。移動平臺的資源路徑問題

想要讀取一個文件,自然首先要找到這個文件,下面小匹夫首先會總結一下unity3d中存在的各個地址,之后再總結一下各個地址在各個移動平臺中的對應位置。Unity3D中的資源路徑

Application.dataPath

此屬性用于返回程序的數據文件所在文件夾的路徑。例如在Editor中就是Assets了。

Application.streamingAssetsPath

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

Application.persistentDataPath

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

Application.temporaryCachePath

此屬性用于返回一個臨時數據的緩存目錄。

[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中各個地址在不同平臺上的含義,下一個問題就來了,也就是我打包之后的資源要怎么和這些地址對應上呢?要知道在pc的editor里默認的資源文件存放的路徑就是Assets啊,為何又會派生出那么多路徑呢?那么就帶著這個疑問,和小匹夫一起進行下文的內容吧。簡單介紹一下unity3d中資源的處理種類(歡迎拍磚):
小匹夫遇到過的大體就是如下幾種了,Resources、StreamingAssets、AssetBundle、PersistentDataPath,下面簡單分析一下。Resources

是作為一個Unity3D的保留文件夾出現的,也就是如果你新建的文件夾的名字叫Resources,那么里面的內容在打包時都會被無條件的打到發布包中。它的特點簡單總結一下就是:
只讀,即不能動態修改。所以想要動態更新的資源不要放在這里。

會將文件夾內的資源打包集成到.asset文件里面。因此建議可以放一些Prefab,因為Prefab在打包時會自動過濾掉不需要的資源,有利于減小資源包的大小。

主線程加載。

資源讀取使用Resources.Load()。

StreamingAssets

要說到StreamingAssets,其實和Resources還是蠻像的。同樣作為一個只讀的Unity3D的保留文件夾出現。不過兩者也有很大的區別,那就是Resources文件夾中的內容在打包時會被壓縮和加密。而StreamingAsset文件夾中的內容則會原封不動的打入包中,因此StreamingAssets主要用來存放一些二進制文件。下面也同樣做一個簡單的總結:
同樣,只讀不可寫。

主要用來存放二進制文件。

只能用過WWW類來讀取。

AssetBundle

關于AssetBundle的介紹已經有很多了。簡而言之就是把prefab或者二進制文件封裝成AssetBundle文件(也是一種二進制)。但是也有硬傷,就是在移動端無法更新腳本。下面簡單的總結下:
是Unity3D定義的一種二進制類型。

最好將prefab封裝成AseetBundle,不過上面不是才說了在移動端無法更新腳本嗎?那從Assetbundle中拿到的Prefab上掛的腳本是不是就無法運行了?也不一定,只要這個prefab上掛的是本地腳本,就可以。

使用WWW類來下載。

PersistentDataPath

看上去它只是個路徑呀,可為什么要把它從路徑里面單獨拿出來介紹呢?因為它的確蠻特殊的,這個路徑下是可讀寫。而且在IOS上就是應用程序的沙盒,但是在Android可以是程序的沙盒,也可以是sdcard。并且在Android打包的時候,ProjectSetting頁面有一個選項Write Access,可以設置它的路徑是沙盒還是sdcard。下面同樣簡單的總結一下:
內容可讀寫,不過只能運行時才能寫入或者讀取。提前將數據存入這個路徑是不可行的。

無內容限制。你可以從StreamingAsset
中讀取二進制文件或者從AssetBundle
讀取文件來寫入PersistentDataPath
中。

寫下的文件,可以在電腦上查看。同樣也可以清掉。

好啦,小匹夫介紹到這里,各位看官們是不是也都清楚了一些呢?那么下面我們就開始最后一步了,也就是如何在移動平臺如何讀取外部文件。移動平臺讀取外部文件的方法

上文小匹夫之所以要介紹Resources、StreamingAssets、AssetBundle、PersistentDataPath這四個東東,就是因為讀取外部資源的操作所涉及到的東西無外乎這幾種。既然是用Unity3D來開發游戲,那么自然要使用Unity3D規定的操作方式,而不是我們在PC上很原始的那種操作方式來操作咯。否則就會像本文一開始所演示的那樣,寫出移動端無法使用的很傻的代碼來。下面小匹夫就分別實現一下利用Resources、StreamingAssets、AssetBundle來讀取的過程。Resources:

首先我們新建一個Resources目錄,并且將上面我們用到的Test.xml復制一份到這個文件夾中。如圖:
然后我們通過Resources的讀取方法來讀取Test.xml的內容。并且調用GUI將xml的內容繪制出來。

[C#] *純文本查看
*復制代碼


//用Resources讀取xml

using UnityEngine;

using System.Collections;

using EggToolkit;

using System.Xml.Linq;
using System.Xml;

 
public class Test : MonoBehaviour {

    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.fon\= 20; 

        titleStyle.normal.textColor =newColor(46f/256f, 163f/256f, 256f/256f, 256f/256f); 

        GUI.Label(newRect(400, 10, 500, 200),  _result,titleStyle);    
}

 
}

結果如圖:

OK,Resources讀取外部資源目標達成!!下面我們繼續,這次則是使用StreamingAssets來操作。StreamingAssets:

同Resources一樣,我們要新建一個StreamingAssets的文件夾來存放我們的Test.xml文件。如圖:
不過前文已經說了,StreamingAssets文件夾內的東西并不會被壓縮和加密,而是放進去什么就是什么,所以一般是要放二進制文件的,這里小匹夫僅僅做一個演示,各位在實際操作中切記不要直接把數據文件放到這個目錄中打包。
[C#] *純文本查看

*復制代碼



using UnityEngine;
using System.Collections;
using EggToolkit;
using System.Xml.Linq;
using System.Xml;
using System.IO;
 
public class Test : MonoBehaviour {

    
private string _result;

 
    
// Use this for initialization

    
void Start () {

         StartCoroutine(LoadXML());
}

    
 
    
// Update is called once per frame

    

 
    
/// <summary>

    
/// 如前文所述,streamingAssets只能使用www來讀取,

    
/// 如果不是使用www來讀取的同學,就不要問為啥讀不到streamingAssets下的內容了。

    
/// 這里還可以使用了persistenDataPath來保存從streamingassets那里讀到內容。

    
/// </summary>

    
IEnumerator LoadXML()
  {

        strings Path= Application.streamingAssetsPath +"/Test.xml";

        WWW www =newWWW(sPath);

        yield return www;
      
      _result = www.text;

    
}

    
 
    
void
OnGUI(){
        
GUIStyle titleStyle =new GUIStyle(); 

     titleStyle.fon\= 20; 

        titleStyle.normal.textColor =newColor(46f/256f, 163f/256f, 256f/256f, 256f/256f); 

        
GUI.Label(newRect(400, 10, 500, 200),  _result,titleStyle);

    
}

 
}

結果如圖:

OK,StreamingAssets讀取外部資源目標達成!!下面我們繼續,最后則是使用AssetBundle來操作。AssetBundle:
來到AssetBundle,這里就和上面兩個不一樣了。首先我們要把我們的文件Test.xml打成AssetBundle文件,由于小匹夫使用的是小米3作為測試機,所以AssetBundle的平臺選擇為Andorid。如圖,我們創建了一個AssetBundle文件,并命名為TextXML。并且按照二進制文件放入StreamingAssets文件夾中的慣例,將這個AssetBundle文件放入StreamingAssets文件夾。[圖片上傳中。。。(7)]那么下面就是從AssetBudle中讀取Test.xml的內容咯。直接上代碼:
[C#] *純文本查看
*復制代碼


//從AssetBundle中讀取xml

using EggToolkit;

using System.Xml.Linq;

using System.Xml;

using System.IO;

 
public class Test : MonoBehaviour {

    
private string _result;

    
 
    
// Use this for initialization

    
void Start () {

        LoadXML();

    }

    
 
    
// Update is called once per frame

    

 
 
    
void LoadXML()    
{
AssetBundle AssetBundleCsv =newAssetBundle();

        
//讀取放入StreamingAssets文件夾中的bundle文件

        
string str = Application.streamingAssetsPath +"/"+"TestXML.bundle";

        WWW www =newWWW(str);

        www = WWW.LoadFromCacheOrDownload(str, 0);   

        AssetBundleCsv = www.assetBundle;       
        string path ="Test";

    
 
        
TextAsset test = AssetBundleCsv.Load(path,typeof(TextAsset))asTextAsset;

 
        
 _result = test.ToString();

    
}

void OnGUI()
{

GUIStyle titleStyle =newGUIStyle(); 

        titleStyle.fon\= 20; 

        titleStyle.normal.textColor =new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f); 

        GUI.Label(newRect(400, 10, 500, 200),  _result,titleStyle);

    
}

    
 
}

結果如圖:[圖片上傳中。。。(8)]OK,AssetBundle讀取外部資源目標也達成了!!補充:

在此統一回答一下在評論和qq上有同學提出的一個問題:
安卓上Application.persistentDataPath的內容貌似不是匹夫你表里的那個呀?

在本文的評論里小匹夫已經回復過了,其實文中也說過

前言:

一直有個想法,就是把工作中遇到的坑通過自己的深挖總結成一套相同[問題
的解決方案供各位同行拍磚探討。眼瞅著2015年第一個工作日就要來到了,小匹夫也休息的差不多了,尋思著也該寫點東西活動活動大腦和手指了。那么今天開始,小匹夫會記錄一些平時工作中遇到的坑,以及小匹夫的應對方法,歡迎各位拍磚討論。那么今天主要討論一下[unity
3D在移動端如何動態的讀取外部文件,比如csv(txt),xml一類的文件。主要涉及的問題,就是PC端上本來測試的好好的東西,到了移動端就不能用了,所以要討論一下PC端和移動端的區別,那么下一個問題自然而然的就是移動端的資源路徑(要討論一下Resources、StreamingAssets、AssetBundle、PersistentDataPath),最后一步就是找到了資源如何讀取(這里也會具體到對應的幾種情況,即Resources、StreamingAssets、AssetBundle),主要的思路就是這樣啦。對嘞,前言部分還是要祝各位看官新的一年身體健康,升職加薪。假如我想在editor里動態讀取文件

實際的游戲開發中,其實有相當一部分靜態數據是可以放在客戶端的,所以勢必會產生要動態讀取這些文件的需求,比如csv(其實就是文本文件),xml等等。我相信大家不管是用win還是用mac來做[unity3d
的開發,都一定要先在editor中去實現基本的功能,在具體到各個移動平臺上去調試。所以作為要讀取外部文件的第一步,顯然我們要先在editor也就是pc上實現這個功能。下面給各位舉一個讀取xml的例子,也是我在以前的一篇文章《自己動手之使用反射和泛型,動態讀取XML創建類實例并賦值》中使用過的,動態讀取一個xml文件并動態生成一個類。下面是我們用來做例子的xml文件,Test.xml:
[XML] *純文本查看
*復制代碼


<?xmlversion="1.0"encoding="UTF-8"?>
<test>   
<name>chenjd</name>   
<blog>http://www.cnblogs.com/murongxiaopifu/</blog>   
<organization>Fanyoy</organization>   
<age>25</age>
</test>

我們就可以很任性的把這個文件隨便丟在一個地方,只要你能指定對它的地址。例如我還把它放在那篇文章中的地址Assets/xml-to-egg/xml-to-egg-test/

文件夾下(的確很任性)
下面我們實現在PC上讀取這個文件內容的代碼:

[C#] *純文本查看
*復制代碼


//讀取xml測試

using UnityEngine;

using System.Collections;

using EggToolkit;

using System.Xml.Linq;

public class Test : MonoBehaviour {

 
    
// Use this for initialization

    
void Start () {

        
XElement result = LoadXML("Assets/xml-to-egg/xml-to-egg-test/Test.xml");
//任性的地址
        Debug.Log(result.ToString());
  
}

    
 
    

    
private
 XElement LoadXML(string path)
{ 
        XElement xml = XElement.Load(path);
        return xml;    
}

}

結果如下:

結果是讀取成功了。但是你以為到這一步就成功了,那就錯了。因為這樣的代碼到移動端是行不通的,至少2處可以被罵sb:
醉人的地址,地址參數那樣寫就不用考慮跨平臺了。所以這個sb點引出的問題就是在移動端unity3d找不到目標文件

使用的還是pc上傳統的一套讀取資源的做法,沒有使用unity3d提供的方法,所以可能導致的問題是找得到文件但是沒有正確的讀取文件內容

以上用紅色標出的問題,便是小匹夫想到的可能出現的問題,也是下文要討論的內容。那么我們首先來看看資源路徑在各個平臺上的不同之處吧。移動平臺的資源路徑問題

想要讀取一個文件,自然首先要找到這個文件,下面小匹夫首先會總結一下unity3d中存在的各個地址,之后再總結一下各個地址在各個移動平臺中的對應位置。Unity3D中的資源路徑

Application.dataPath

此屬性用于返回程序的數據文件所在文件夾的路徑。例如在Editor中就是Assets了。

Application.streamingAssetsPath

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

Application.persistentDataPath

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

Application.temporaryCachePath

此屬性用于返回一個臨時數據的緩存目錄。

[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中各個地址在不同平臺上的含義,下一個問題就來了,也就是我打包之后的資源要怎么和這些地址對應上呢?要知道在pc的editor里默認的資源文件存放的路徑就是Assets啊,為何又會派生出那么多路徑呢?那么就帶著這個疑問,和小匹夫一起進行下文的內容吧。簡單介紹一下unity3d中資源的處理種類(歡迎拍磚):
小匹夫遇到過的大體就是如下幾種了,Resources、StreamingAssets、AssetBundle、PersistentDataPath,下面簡單分析一下。Resources

是作為一個Unity3D的保留文件夾出現的,也就是如果你新建的文件夾的名字叫Resources,那么里面的內容在打包時都會被無條件的打到發布包中。它的特點簡單總結一下就是:
只讀,即不能動態修改。所以想要動態更新的資源不要放在這里。

會將文件夾內的資源打包集成到.asset文件里面。因此建議可以放一些Prefab,因為Prefab在打包時會自動過濾掉不需要的資源,有利于減小資源包的大小。

主線程加載。

資源讀取使用Resources.Load()。

StreamingAssets

要說到StreamingAssets,其實和Resources還是蠻像的。同樣作為一個只讀的Unity3D的保留文件夾出現。不過兩者也有很大的區別,那就是Resources文件夾中的內容在打包時會被壓縮和加密。而StreamingAsset文件夾中的內容則會原封不動的打入包中,因此StreamingAssets主要用來存放一些二進制文件。下面也同樣做一個簡單的總結:
同樣,只讀不可寫。

主要用來存放二進制文件。

只能用過WWW類來讀取。

AssetBundle

關于AssetBundle的介紹已經有很多了。簡而言之就是把prefab或者二進制文件封裝成AssetBundle文件(也是一種二進制)。但是也有硬傷,就是在移動端無法更新腳本。下面簡單的總結下:
是Unity3D定義的一種二進制類型。

最好將prefab封裝成AseetBundle,不過上面不是才說了在移動端無法更新腳本嗎?那從Assetbundle中拿到的Prefab上掛的腳本是不是就無法運行了?也不一定,只要這個prefab上掛的是本地腳本,就可以。

使用WWW類來下載。

PersistentDataPath

看上去它只是個路徑呀,可為什么要把它從路徑里面單獨拿出來介紹呢?因為它的確蠻特殊的,這個路徑下是可讀寫。而且在IOS上就是應用程序的沙盒,但是在Android可以是程序的沙盒,也可以是sdcard。并且在Android打包的時候,ProjectSetting頁面有一個選項Write Access,可以設置它的路徑是沙盒還是sdcard。下面同樣簡單的總結一下:
內容可讀寫,不過只能運行時才能寫入或者讀取。提前將數據存入這個路徑是不可行的。

無內容限制。你可以從StreamingAsset
中讀取二進制文件或者從AssetBundle
讀取文件來寫入PersistentDataPath
中。

寫下的文件,可以在電腦上查看。同樣也可以清掉。

好啦,小匹夫介紹到這里,各位看官們是不是也都清楚了一些呢?那么下面我們就開始最后一步了,也就是如何在移動平臺如何讀取外部文件。移動平臺讀取外部文件的方法

上文小匹夫之所以要介紹Resources、StreamingAssets、AssetBundle、PersistentDataPath這四個東東,就是因為讀取外部資源的操作所涉及到的東西無外乎這幾種。既然是用Unity3D來開發游戲,那么自然要使用Unity3D規定的操作方式,而不是我們在PC上很原始的那種操作方式來操作咯。否則就會像本文一開始所演示的那樣,寫出移動端無法使用的很傻的代碼來。下面小匹夫就分別實現一下利用Resources、StreamingAssets、AssetBundle來讀取的過程。Resources:

首先我們新建一個Resources目錄,并且將上面我們用到的Test.xml復制一份到這個文件夾中。如圖:
然后我們通過Resources的讀取方法來讀取Test.xml的內容。并且調用GUI將xml的內容繪制出來。

[C#] *純文本查看
*復制代碼



//用Resources讀取xml

using UnityEngine;

using System.Collections;

using EggToolkit;

using System.Xml.Linq;

using System.Xml;

 
public class Test : MonoBehaviour {

    
private string _result;

 
    
// Use this for initialization

    
void Start () {
       LoadXML("Test");
}

    
 
    

    
private void LoadXML(string path)
    {
        _result = Resources.Load(path).ToString();
        XmlDocument doc =newXmlDocument();
        doc.LoadXml(_result);
    }

 
    
void OnGUI()    
{        GUIStyle titleStyle =newGUIStyle(); 

        titleStyle.fon\= 20; 

        titleStyle.normal.textColor =newColor(46f/256f, 163f/256f, 256f/256f, 256f/256f); 

        GUI.Label(newRect(400, 10, 500, 200),  _result,titleStyle);

    }

 }

結果如圖:

OK,Resources讀取外部資源目標達成!!下面我們繼續,這次則是使用StreamingAssets來操作。StreamingAssets:

同Resources一樣,我們要新建一個StreamingAssets的文件夾來存放我們的Test.xml文件。如圖:
不過前文已經說了,StreamingAssets文件夾內的東西并不會被壓縮和加密,而是放進去什么就是什么,所以一般是要放二進制文件的,這里小匹夫僅僅做一個演示,各位在實際操作中切記不要直接把數據文件放到這個目錄中打包。
[C#] *純文本查看

*復制代碼


using UnityEngine;

using System.Collections;

using EggToolkit;

using System.Xml.Linq;

using System.Xml;

using System.IO;

 
public class Test : MonoBehaviour {

    
private string _result;

 
    
// Use this for initialization

    
void Start () {

        StartCoroutine(LoadXML());

    }

    
 
    
// Update is called once per frame

    

 
    
/// <summary>

    
/// 如前文所述,streamingAssets只能使用www來讀取,

    
/// 如果不是使用www來讀取的同學,就不要問為啥讀不到streamingAssets下的內容了。

    
/// 這里還可以使用了persistenDataPath來保存從streamingassets那里讀到內容。

    
/// </summary>

    
IEnumerator LoadXML()  
{      
stringsPath= Application.streamingAssetsPath +"/Test.xml";

        WWW www =newWWW(sPath);

        yieldreturnwww;

        _result = www.text;

    }

    
 
    
void OnGUI()

    {

        GUIStyle titleStyle =newGUIStyle(); 

        titleStyle.fon\= 20; 

        titleStyle.normal.textColor =newnColor(46f/256f, 163f/256f, 256f/256f, 256f/256f); 

        
GUI.Label(newRect(400, 10, 500, 200),  _result,titleStyle);

    }

 }

結果如圖:

OK,StreamingAssets讀取外部資源目標達成!!下面我們繼續,最后則是使用AssetBundle來操作。AssetBundle:
來到AssetBundle,這里就和上面兩個不一樣了。首先我們要把我們的文件Test.xml打成AssetBundle文件,由于小匹夫使用的是小米3作為測試機,所以AssetBundle的平臺選擇為Andorid。如圖,我們創建了一個AssetBundle文件,并命名為TextXML。并且按照二進制文件放入StreamingAssets文件夾中的慣例,將這個AssetBundle文件放入StreamingAssets文件夾。[圖片上傳中。。。(15)]那么下面就是從AssetBudle中讀取Test.xml的內容咯。直接上代碼:
[C#] *純文本查看
*復制代碼



//從AssetBundle中讀取xml

using EggToolkit;

using System.Xml.Linq;

using System.Xml;

using System.IO;

 
public class Test : MonoBehaviour {

    private string_ result;

    
 
    


    
void Start () {

        LoadXML();

    }

    
 
    

 
 
    
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))asTextAsset;

 
        _result = test.ToString();

    }

    
 
    
void OnGUI()

    {        GUIStyle titleStyle =newGUIStyle(); 

        titleStyle.fon\= 20; 

        titleStyle.normal.textColor =new Color(46f/256f, 163f/256f, 256f/256f, 256f/256f); 

        GUI.Label(new Rect(400, 10, 500, 200),  _result,titleStyle);

    }

    
 }

結果如圖:[圖片上傳中。。。(16)]OK,AssetBundle讀取外部資源目標也達成了!!補充:

在此統一回答一下在評論和qq上有同學提出的一個問題:
安卓上Application.persistentDataPath的內容貌似不是匹夫你表里的那個呀?

在本文的評論里小匹夫已經回復過了,其實文中也說過

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,829評論 18 139
  • 1、什么是AssetBundle AssetBundle 是Unity pro提供的一種用來存儲資源的文件格式,它...
    好怕怕閱讀 7,601評論 1 8
  • Unity3D 里有兩種動態加載機制:一個是Resources.Load,另外一個通過AssetBundle,其實...
    IongX閱讀 1,730評論 0 5
  • 111. [動畫系統]如何將其他類型的動畫轉換成關鍵幀動畫? 動畫->點緩存->關鍵幀 112. [動畫]Unit...
    胤醚貔貅閱讀 13,145評論 3 90
  • 遍野欺霜寒瑟瑟,凄風催展蕊含香。 紅樓賦曲憐花淚,碧院調弦撫葉傷。 御賜珍珠冰吐艷,題詩舊帕雪凝妝。 天然麗質孤芳...
    半溪煙水閱讀 275評論 1 6