上一節(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é)果:
- Android平臺(tái)測(cè)試結(jié)果:
注意:
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é)果:
- Android平臺(tái)測(cè)試結(jié)果:
注意:
這個(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é)果:
- Android平臺(tái)測(cè)試結(jié)果:
基本語(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é)果:
- Android平臺(tái)測(cè)試結(jié)果:
將以上四個(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)題要講到Resources、StreamingAssets戏蔑、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);
}
}
- 在WindowEditor平臺(tái)下運(yùn)行結(jié)果:
- 2 在Android平臺(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ì)放在改文件夾下)如下圖所示:
- 然后創(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;
}
}
- 在WindowEditor平臺(tái)下運(yùn)行結(jié)果:
- 2 在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