Unity API——Application類(lèi)的詳解(二):數(shù)據(jù)文件路徑

上一節(jié)中將Application類(lèi)中所有的靜態(tài)屬性和靜態(tài)方法都一一列舉赔嚎,方便以后查閱限煞。接下將詳細(xì)介紹Application類(lèi)的屬性和方法撮抓。
上一節(jié)傳送門(mén):Unity API——Application類(lèi)的詳解(一):列舉屬性和方法


數(shù)據(jù)文件路徑:總共有四個(gè)屬性棋电,分別為:dataPath振劳、persistentDataPath椎组、streamingAssetsPath、 temporaryCachePath


基本語(yǔ)法:public static string dataPath { get ;}

dataPaht是包含游戲數(shù)據(jù)文件夾的路徑历恐,權(quán)限為只讀寸癌,返回的是一個(gè)相對(duì)路徑,即對(duì)于不同的游戲平臺(tái)返回的路徑是不一樣的弱贼。
Unity Editor: <path tp project folder>/Assets
Mac player: <path to player app bundle>/Contents
iOS player: <
path to player app bundle
>/<
AppName.app
>/Data
Android:/data/app/xxx.xxx.xxx.apk

測(cè)試代碼:

using UnityEngine;
using System.Collections;
/// <summary>
/// 此類(lèi)用于 dataPath測(cè)試
/// </summary>
public class DataPath : MonoBehaviour 
{
    private void printDataPath()
    {
        Debug.Log("dataPaht:" + Application.dataPath);
    }
    void Start () 
    {
        printDataPath();
    }
    
}

由于設(shè)備和條件有限蒸苇,我只在Unity Editor 和android兩個(gè)環(huán)境下作了測(cè)試,測(cè)試結(jié)果如下:

  • Unity Editor測(cè)試結(jié)果:
Unity Editor 控制臺(tái)打印出的日志
  • Android平臺(tái)測(cè)試結(jié)果:
LogCat下打印的日志

注意

Application.dataPath 返回的路徑目錄吮旅,在移動(dòng)端是沒(méi)有訪(fǎng)問(wèn)權(quán)限的(既不能訪(fǎng)問(wèn)此目錄)溪烤。


基本語(yǔ)法:public static string persistentDataPath{ get ;}

persistentDataPaht返回的是一個(gè)持久化數(shù)據(jù)存儲(chǔ)目錄,權(quán)限為只讀,在同一平臺(tái)庇勃,不用的應(yīng)用程序訪(fǎng)問(wèn)此屬性返回值相同檬嘀,但是不同的平臺(tái)就不相同了。當(dāng)應(yīng)用程序發(fā)布到IOS和Android平臺(tái)中责嚷,這個(gè)路徑會(huì)指向一個(gè)公共的路徑鸳兽,而且應(yīng)用每次更新時(shí)這里的數(shù)據(jù)不會(huì)被清除。

測(cè)試代碼:

using UnityEngine;
using System.Collections;
/// <summary>
/// 此類(lèi)用于 persistentDataPath測(cè)試
/// </summary>
public class DataPath : MonoBehaviour 
{

    private void printPersistentDataPaht()
    {
        Debug.Log("persistentDataPaht:" + Application.persistentDataPath);
    }
    void Start () 
    {
        printPersistentDataPaht();
    }

    
}


  • Unity Editor測(cè)試結(jié)果:
Unity Editor 控制臺(tái)打印出的日志
  • Android平臺(tái)測(cè)試結(jié)果:

LogCat下打印的日志

注意

這個(gè)路徑比較特殊再层,這個(gè)路徑下是可讀寫(xiě)贸铜。而且在IOS上就是應(yīng)用程序的沙盒,但是在Android可以是程序的沙盒聂受,也可以是sdcard蒿秦。并且在Android打包的時(shí)候,ProjectSetting頁(yè)面有一個(gè)選項(xiàng)Write Access蛋济,可以設(shè)置它的路徑是沙盒還是sdcard棍鳖。該路徑的特點(diǎn):

  • 內(nèi)容可讀寫(xiě),不過(guò)只能運(yùn)行時(shí)才能寫(xiě)入或者讀取碗旅。提前將數(shù)據(jù)存入這個(gè)路徑是不可行的渡处。
  • 無(wú)內(nèi)容限制。你可以從StreamingAsset中讀取二進(jìn)制文件或者從AssetBundle讀取文件來(lái)寫(xiě)入PersistentDataPath中祟辟。
  • 寫(xiě)下的文件医瘫,可以在電腦上查看。同樣也可以清掉旧困。

基本語(yǔ)法:public static string streamingAssetsPath{ get ;}

streamingAssetsPath返回的是流數(shù)據(jù)的緩存目錄醇份,返回路徑為相對(duì)路徑適合用來(lái)存儲(chǔ)一些外部數(shù)據(jù)文件。

測(cè)試代碼:

using UnityEngine;
using System.Collections;
/// <summary>
/// 此類(lèi)用于 streamingAssetsPath測(cè)試
/// </summary>
public class DataPath : MonoBehaviour 
{
    private void printStreamingAssetsPaht()
    {
        Debug.Log("streamingAssetsPaht:" + Application.streamingAssetsPath);
    }

    void Start () 
    {
        printStreamingAssetsPaht();
    }
}


  • Unity Editor測(cè)試結(jié)果:
Unity Editor 控制臺(tái)打印的日志
  • Android平臺(tái)測(cè)試結(jié)果:
Logcat打印的日志

基本語(yǔ)法:public static string temporaryCachePath{ get ;}

temporaryCachePath返回一個(gè)臨時(shí)數(shù)據(jù)緩存目錄(只讀)吼具,同一平臺(tái)不用應(yīng)用程序訪(fǎng)問(wèn)此屬性的返回值相同僚纷,不同平臺(tái)返回值不同。

測(cè)試代碼:

using UnityEngine;
using System.Collections;
/// <summary>
/// 此類(lèi)用于 temporayrCachePaht測(cè)試
/// </summary>
public class DataPath : MonoBehaviour 
{
    private void printTemporaryCachePath()
    {
        Debug.Log("temporaryCachePaht:" + Application.temporaryCachePath);
    }

    void Start () 
    {
        printTemporaryCachePath();
    }

}


  • Unity Editor測(cè)試結(jié)果:
Unity Editor 控制臺(tái)打印的日志
  • Android平臺(tái)測(cè)試結(jié)果:
LogCat打印的日志

將以上四個(gè)路徑分別在Unity Editor和Android環(huán)境下進(jìn)行一個(gè)對(duì)比:

  • Unity Editor 平臺(tái)
    dataPath:      D:/unity/workSpace/MyReadBook/Assets
    persistentDataPath:  C:/Users/young/AppData/LocalLow/young/datapahttest
    streamingAssetsPath: D:/unity/workSpace/MyReadBook/Assets/StreamingAssets
    temporaryCachePath: C:/Users/young/AppData/Local/Temp/young/datapahttest
  • Android 平臺(tái)
    dataPath:       /data/app/com.young.datapahttest-1.apk
    persistentDataPath:   /data/data/com.young.datapahttest/files
    streamingAssetsPath:  jar:file:///data/app/com.young.datapahttest-1.apk!/assets
    temporaryCachePath:  /data/data/com.young.datapahttest/cache

從中可以看出拗盒,dataPath 和 stremingAssetsPath是相對(duì)于程序的安裝目錄怖竭,是相對(duì)路徑。非常適用于移植平臺(tái)設(shè)置外部數(shù)據(jù)文件讀取路徑陡蝇。而persistentDataPath和temporaryCachePath返回的程序所在平臺(tái)的固定位置痊臭。適用于存儲(chǔ)程序運(yùn)行過(guò)程中一些數(shù)據(jù)。

總結(jié):


  • 四個(gè)路徑的含義
屬性名稱(chēng) 含義
Application.dataPath 此屬性用于返回程序的數(shù)據(jù)文件所在文件夾的路徑
Application.streamingAssetsPath 此屬性用于返回流數(shù)據(jù)的緩存目錄毅整,返回路徑為相對(duì)路徑趣兄,適合設(shè)置一些外部數(shù)據(jù)文件的路徑。
Application.persistentDataPath 此屬性用于返回一個(gè)持久化數(shù)據(jù)存儲(chǔ)目錄的路徑悼嫉,可以在此路徑下存儲(chǔ)一些持久化的數(shù)據(jù)文件:
Application.temporaryCachePath 此屬性用于返回一個(gè)臨時(shí)數(shù)據(jù)的緩存目錄艇潭。
  • Android 平臺(tái)
屬性名稱(chēng) 返回路徑
Application.dataPaht /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 平臺(tái)
屬性名稱(chēng) 返回路徑
Application.dataPaht 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
  • Unity Editor平臺(tái)
屬性名稱(chēng) 返回路徑
Application.dataPaht Application(工程目錄)/Assets
Application.streamingAssetsPath Application(工程目錄)/Assets/StreamingAssets
Application.persistentDataPath 系統(tǒng)指定目錄1/工程名
Application.temporaryCachePath 系統(tǒng)指定目錄2/工程名

擴(kuò)展:Unity資源處理(參考了:Unity3D移動(dòng)平臺(tái)動(dòng)態(tài)讀取外部文件全解析

關(guān)于資源加載問(wèn)題要講到ResourcesStreamingAssets戏蔑、AssetBundle這三個(gè)類(lèi)蹋凝。

Resources:
它作為一個(gè)Unity3D的保留文件夾出現(xiàn)的,也就是如果你新建的文件夾的名字叫Resources总棵,那么里面的內(nèi)容在打包時(shí)都會(huì)被無(wú)條件的打到發(fā)布包中鳍寂。其特點(diǎn)是:

  • 只讀,即不能動(dòng)態(tài)修改情龄。所以想要?jiǎng)討B(tài)更新的資源不要放在這里迄汛。
  • 會(huì)將文件夾內(nèi)的資源打包集成到.asset文件里面捍壤。因此建議可以放一些Prefab,因?yàn)镻refab在打包時(shí)會(huì)自動(dòng)過(guò)濾掉不需要的資源鞍爱,有利于減小資源包的大小鹃觉。
  • 主線(xiàn)程加載。
  • 資源讀取使用Resources.Load()睹逃。

實(shí)例測(cè)試

  • 首先新建一個(gè)用于測(cè)試的text.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<test>
    <name>young</name>
    <blog>http://www.reibang.com/users/afda32f1cc9a/latest_articles</blog>
    <age>21</age>
    <address>China</address>
</test>
  • 然后在Assets文件夾下新建一個(gè)Resources目錄,將text.xml放在改目錄下盗扇,如下圖所示:
  • 新建一個(gè)腳本ReadXMLInResources.cs掛在Main Camera下,腳本代碼如下:
using UnityEngine;
using System.Collections;
using System.Xml;


/// <summary>
/// 此類(lèi)用于測(cè)試 在Resources目錄下讀取XML文件
/// </summary>
public class ReadXMLInResources : MonoBehaviour
{

    private string readXMLResult;

    // Use this for initialization
    void Start () {
        LoadXML("text");
        Debug.Log("xml:" + readXMLResult);
    
    }
    
    // Update is called once per frame
    void Update () {
    
    }

    void OnGUI()
    {
        GUIStyle titleStyle = new GUIStyle();
        titleStyle.fontSize = 20;
        titleStyle.normal.textColor = new Color(0, 255, 255);
        GUI.Label(new Rect(400, 10, 500, 200), readXMLResult, titleStyle );
    }

    /// <summary>
    /// 加載Assets/Resources文件夾下resourcesName文件
    /// </summary>
    /// <param name="resourcesName"></param>
    private void LoadXML(string resourcesName)
    {
        readXMLResult = Resources.Load(resourcesName).ToString();

        XmlDocument doc = new XmlDocument();

        doc.LoadXml(readXMLResult);
    }



}

    1. 在WindowEditor平臺(tái)下運(yùn)行結(jié)果:
WindowsEditor運(yùn)行結(jié)果截圖
  • 2 在Android平臺(tái)下運(yùn)行結(jié)果:
Andorid平臺(tái)下運(yùn)行結(jié)果截圖

StreamingAssets:
要說(shuō)到StreamingAssets沉填,其實(shí)和Resources還是蠻像的疗隶。同樣作為一個(gè)只讀的Unity3D的保留文件夾出現(xiàn)。不過(guò)兩者也有很大的區(qū)別翼闹,那就是Resources文件夾中的內(nèi)容在打包時(shí)會(huì)被壓縮和加密斑鼻。而StreamingAsset文件夾中的內(nèi)容則會(huì)原封不動(dòng)的打入包中,因此StreamingAssets主要用來(lái)存放一些二進(jìn)制文件猎荠。下面也同樣做一個(gè)簡(jiǎn)單的總結(jié):

  • 只讀不可寫(xiě)卵沉。
  • 主要用來(lái)存放二進(jìn)制文件。
  • Android平臺(tái)下一般是通過(guò)過(guò)WWW類(lèi)來(lái)讀取法牲。

實(shí)例測(cè)試

-首先在Assets目錄下新建StreamingAssets文件夾史汗,將text.xml放入改目錄下(此例金座測(cè)試,實(shí)際數(shù)據(jù)文件一般不會(huì)放在改文件夾下)如下圖所示:

Paste_Image.png
  • 然后創(chuàng)建一個(gè)ReadXMLInStreamingAssets.cs腳本 掛在Main Camera下拒垃,腳本代碼如下:
using UnityEngine;
using System.Collections;
using System.IO;

public class ReadXMLInStreamingAssets : MonoBehaviour
{
    /// <summary>
    /// 讀取XML結(jié)果
    /// </summary>
    private string readXmlResult;

    // Use this for initialization
    void Start ()
    {
        loadXML();
        Debug.Log(readXmlResult);
    }
    
    // Update is called once per frame
    void Update () {
    
    }


    void OnGUI()
    {
        GUIStyle titleStyle = new GUIStyle();
        titleStyle.fontSize = 20;
        titleStyle.normal.textColor = new Color(0, 255, 255);
        GUI.Label(new Rect(400, 10, 500, 200), readXmlResult, titleStyle);
    }


    /// <summary>
    /// 根據(jù)不同的平臺(tái)加載StremingAssets文件夾下的XML文件
    /// </summary>
    private void loadXML()
    {
        if(Application.platform == RuntimePlatform.Android)
        {
            Debug.Log("android platform");
            StartCoroutine("loadXMLWithWWW");
        }
        else if(Application.platform == RuntimePlatform.WindowsEditor)
        {
            Debug.Log("window platform");
            //獲得文件路徑
            string path = Application.streamingAssetsPath + "/text.xml";
            loadXMLWithStreamReader(path);
        }
        else if(Application.platform == RuntimePlatform.IPhonePlayer)
        {
            Debug.Log("iphone platform");
            //獲得文件路徑
            string path = Application.streamingAssetsPath +"/text.xml";
            loadXMLWithStreamReader(path);

        }
        //發(fā)現(xiàn)所有平臺(tái)StreamingAssets目錄下的文件路徑都可以用Application.streamingAssetsPath +"/fileName.xml"來(lái)加載停撞,但Android加載方式不一樣
    }

    /// <summary>
    /// 使用StreamReader讀取文件信息
    /// </summary>
    /// <param name="path">讀取文件的路徑</param>
    private void loadXMLWithStreamReader(string path)
    {  
        FileInfo fileInfo = new FileInfo(path);
        StreamReader reader = fileInfo.OpenText();
        readXmlResult = reader.ReadToEnd();
        reader.Close();
    }

    /// <summary>
    /// 
    ///對(duì)于android平臺(tái), streamingAssets中的文件一般只能用www來(lái)異步讀取
    /// (同時(shí)悼瓮,可以用persistenDataPath來(lái)保存streamingassets里讀取的數(shù)據(jù))
    /// </summary>
    /// <returns></returns>
    IEnumerator loadXMLWithWWW()
    {
        //獲得文件路徑
        string path = Application.streamingAssetsPath + "/text.xml";
        WWW www = new WWW(path);

        yield return www;

        readXmlResult = www.text;

    }
}

    1. 在WindowEditor平臺(tái)下運(yùn)行結(jié)果:
WindowEditor平臺(tái)下運(yùn)行結(jié)果截圖
  • 2 在Android平臺(tái)下運(yùn)行結(jié)果:

Android平臺(tái)下運(yùn)行結(jié)果截圖

AssetBundle
是把prefab或者二進(jìn)制文件封裝成AssetBundle文件(也是一種二進(jìn)制)戈毒。但是也有硬傷,就是在移動(dòng)端無(wú)法更新腳本横堡。下面簡(jiǎn)單的總結(jié)下:

  • 是Unity3D定義的一種二進(jìn)制類(lèi)型埋市。
  • 最好將prefab封裝成AseetBundle,不過(guò)上面不是才說(shuō)了在移動(dòng)端無(wú)法更新腳本嗎命贴?那從Assetbundle中拿到的Prefab上掛的腳本是不是就無(wú)法運(yùn)行了道宅?也不一定,只要這個(gè)prefab上掛的是本地腳本胸蛛,就可以污茵。
  • 使用WWW類(lèi)來(lái)下載。

實(shí)例測(cè)試

待續(xù)葬项。泞当。。

特別說(shuō)明:

本文案例工程使用的Unity編輯器版本為5.1.1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末民珍,一起剝皮案震驚了整個(gè)濱河市襟士,隨后出現(xiàn)的幾起案子盗飒,更是在濱河造成了極大的恐慌,老刑警劉巖陋桂,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箩兽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡章喉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)身坐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秸脱,“玉大人,你說(shuō)我怎么就攤上這事部蛇√剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵涯鲁,是天一觀(guān)的道長(zhǎng)巷查。 經(jīng)常有香客問(wèn)我,道長(zhǎng)抹腿,這世上最難降的妖魔是什么岛请? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮警绩,結(jié)果婚禮上崇败,老公的妹妹穿的比我還像新娘。我一直安慰自己肩祥,他們只是感情好后室,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著混狠,像睡著了一般岸霹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上将饺,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天恬涧,我揣著相機(jī)與錄音,去河邊找鬼涩笤。 笑死匣吊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桌肴。 我是一名探鬼主播皇筛,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坠七!你這毒婦竟也來(lái)了水醋?” 一聲冷哼從身側(cè)響起旗笔,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拄踪,沒(méi)想到半個(gè)月后蝇恶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惶桐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年撮弧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姚糊。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贿衍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出救恨,到底是詐尸還是另有隱情贸辈,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布肠槽,位于F島的核電站擎淤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏秸仙。R本人自食惡果不足惜嘴拢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寂纪。 院中可真熱鬧炊汤,春花似錦、人聲如沸弊攘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)襟交。三九已至迈倍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捣域,已是汗流浹背啼染。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焕梅,地道東北人迹鹅。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贞言,于是被迫代替她去往敵國(guó)和親斜棚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容