一、Unity中各路徑和目錄的對(duì)應(yīng)關(guān)系
其中结闸,安卓中的路徑是有兩種分支的
在打包面板中唇兑,有個(gè)Write Access
當(dāng)我們選擇Internal Only就是表示沙盒路徑,/data/data/com.xxx.xxx/
對(duì)應(yīng)的Android方法為 getFilesDir()
當(dāng)我們選擇SDCard時(shí)就表示存儲(chǔ)到SD卡上桦锄,: /storage/emulated/0/Android/data/com.example.myapplication/files
PC端:Application.dataPath 就是程序所在目錄扎附,PersistentDataPath是程序運(yùn)行數(shù)據(jù)所在目錄。
二结耀、各個(gè)路徑的特點(diǎn)
1留夜、Resources
是作為一個(gè)Unity的保留文件夾出現(xiàn)的,也就是如果你新建的文件夾的名字叫Resources图甜,那么里面的內(nèi)容在打包時(shí)都會(huì)被無(wú)條件的打到發(fā)布包中碍粥,其中資源的格式會(huì)經(jīng)過(guò)了unity的處理,算是unity的一種資源黑毅。
特點(diǎn):
- 只讀嚼摩,即不能動(dòng)態(tài)修改。所以想要?jiǎng)討B(tài)更新的資源不要放在這里。
- 會(huì)將文件夾內(nèi)的資源打包集成到.asset文件里面枕面。因此建議可以放一些Prefab愿卒,因?yàn)镻refab在打包時(shí)會(huì)自動(dòng)過(guò)濾掉不需要的資源,有利于減小資源包的大小潮秘。
- 資源讀取使用Resources.Load()琼开。
- 任何平臺(tái)都可以用File讀取
2、StreamingAssets
StreamingAssets和Resources很像枕荞。同樣作為一個(gè)只讀的Unity3D的保留文件夾出現(xiàn)柜候。不過(guò)兩者也有很大的區(qū)別,那就是Resources文件夾中的內(nèi)容在打包時(shí)會(huì)被壓縮和加密买猖。而StreamingAsset文件夾中的內(nèi)容則會(huì)原封不動(dòng)的打入包中改橘,因此StreamingAssets主要用來(lái)存放一些二進(jìn)制文件滋尉。這里原封不動(dòng)的意思玉控,是不經(jīng)過(guò)unity自身的處理,因此狮惜,比如把音視頻放這個(gè)文件夾高诺,想直接拖到場(chǎng)景中使用是拖不了的。在任何平臺(tái)中總可以統(tǒng)一使用Application.streamingAssetsPath 屬性來(lái)獲得這一文件夾路徑碾篡。
特點(diǎn):
- PC端可讀寫虱而,移動(dòng)端只讀不可寫存谎。
- 主要用來(lái)存放二進(jìn)制文件浮入,配置文件。
- 注意孵运,在Android中穆律,StreamingAssets中的文件包含在一個(gè).jar壓縮文件(基本上與標(biāo)準(zhǔn)的zip為統(tǒng)一格式)中惠呼,所以移動(dòng)端時(shí)只能用過(guò)UnityWebRequest類來(lái)讀取。在PC下峦耘,可以用File類API(如File.ReadAllText)讀寫StreamingAssets文件夾中的文件剔蹋;在IOS和Android平臺(tái)下,不能用File類API讀取辅髓。
- 任何平臺(tái)都可以用www方式異步讀取該文件夾內(nèi)容泣崩。PC和IOS平臺(tái)下,讀取路徑必須加上"file://"洛口,而安卓不需要矫付。
- 在IOS和Android下,還能用AssetBundle.LoadFromFile來(lái)同步讀取數(shù)據(jù)第焰。
3买优、PersistentDataPath
這個(gè)路徑下是可讀寫。而且在IOS上就是應(yīng)用程序的沙盒,但是在Android可以是程序的沙盒而叼,也可以是sdcard身笤。并且在Android打包的時(shí)候,ProjectSetting頁(yè)面有一個(gè)選項(xiàng)Write Access葵陵,可以設(shè)置它的路徑是沙盒還是sdcard液荸。
特點(diǎn):
-可讀寫,不過(guò)只能運(yùn)行時(shí)才能寫入或者讀取脱篙。 提前將數(shù)據(jù)存入這個(gè)路徑是不可行的娇钱。
- 無(wú)內(nèi)容限制。你可以從 StreamingAsset 中讀取二進(jìn)制文件或者從 AssetBundle 讀取文件來(lái)寫入 PersistentDataPath 中绊困。
- 寫下的文件文搂,可以在電腦上查看。同樣也可以清掉秤朗。
- 可以使用UnityWebRequest類來(lái)讀取煤蹭。
- 可以用File類API(如File.ReadAllText)讀寫PersistentDataPath文件夾中的文件(安卓下唯一可以用File類的路徑)
4、Application.DataPath
注意移動(dòng)端是沒(méi)有訪問(wèn)權(quán)限的取视。在PC端和Editor模式時(shí)硝皂,可讀可寫。
三作谭、Unity文件的讀寫方式
- 讀文件示例鏈接
- 幾個(gè)文件操作類介紹
1稽物、File類和FileInfo類的介紹:
File類和FileInfo類都是提供用于創(chuàng)建、復(fù)制折欠、刪除贝或、移動(dòng)和打開(kāi)文件的方法,一個(gè)是靜態(tài)的锐秦,一個(gè)是實(shí)例方法咪奖。簡(jiǎn)單來(lái)說(shuō),就是Flie類可以直接通過(guò)類名調(diào)用其中的某些函數(shù)农猬,而FileInfo類需要先實(shí)例化一個(gè)對(duì)象赡艰,再通過(guò)對(duì)象調(diào)用函數(shù)。一般來(lái)說(shuō)斤葱,如果是對(duì)文件進(jìn)行少量的操作慷垮,則建議用File類,如果是對(duì)文件進(jìn)行大量的存取操作揍堕,建議用FileInfo類料身,具體原因參照這 。 這里是官方的文檔衩茸,F(xiàn)ile類芹血, FileInfo類。
2、FileStream類和StreamWriter,StreamReader類的簡(jiǎn)單介紹:
FileStream類是一個(gè)操作類幔烛,F(xiàn)ileStream 對(duì)象表示在磁盤或網(wǎng)絡(luò)路徑指向文件的流啃擦,這個(gè)類提供了在文件中讀寫字節(jié)的方法。簡(jiǎn)單來(lái)說(shuō)就是這個(gè)Filestream這個(gè)文件流對(duì) .txt等文件讀寫內(nèi)容時(shí)需要使用的一個(gè)工具饿悬。如果File類是一個(gè)總的文件的話令蛉,那么fileStream類就是對(duì)文件進(jìn)行操作的筆。 FileStream類和StreamWriter,StreamReader類的區(qū)別在于FileStream類操作的是字節(jié)和字節(jié)數(shù)組狡恬,而StreamWriter等類操作的是字符數(shù)據(jù)珠叔。StreamWriter類操作的只能是文本類型的,而FileStream類的對(duì)象可以是任何類型的弟劲。操作文本的話用StreamWriter等比較方便祷安。
下面是用File和FileInfo兩種方式去創(chuàng)建文件,以及用StreamWriter寫文件的方法
File方式
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
public class FileOperate : MonoBehaviour {
public void WriteFileByLine(string file_path,string file_name,string str_info)
{
StreamWriter sw;
if(!File.Exists(file_path+"http://"+file_name))
{
sw=File.CreateText(file_path+"http://"+file_name);//創(chuàng)建一個(gè)用于寫入 UTF-8 編碼的文本
Debug.Log("文件創(chuàng)建成功兔乞!");
}
else
{
sw=File.AppendText(file_path+"http://"+file_name);//打開(kāi)現(xiàn)有 UTF-8 編碼文本文件以進(jìn)行讀取
}
sw.WriteLine(str_info);//以行為單位寫入字符串
sw.Close ();
sw.Dispose ();//文件流釋放
}
void Start()
{
WriteFileByLine (Application.persistentDataPath,"my_newfile.txt","信息");
}
}
FileInfo方式
public void WriteFileByLine(string file_path,string file_name,string str_info)
{
StreamWriter sw;
FileInfo file_info = new FileInfo (file_path+"http://"+file_name);
if(!file_info.Exists)
{
sw=file_info.CreateText();//創(chuàng)建一個(gè)用于寫入 UTF-8 編碼的文本
Debug.Log("文件創(chuàng)建成功汇鞭!");
}
else
{
sw=file_info.AppendText();//打開(kāi)現(xiàn)有 UTF-8 編碼文本文件以進(jìn)行讀取
}
sw.WriteLine(str_info);
sw.Close ();
sw.Dispose ();//文件流釋放
}
四、Unity路徑解疑
上面了解各個(gè)路徑的特性报嵌,讀寫方式虱咧,但是還有一個(gè)經(jīng)常容易犯錯(cuò)的地方熊榛,就是路徑的寫法锚国。
Unity3D關(guān)于路徑資源的調(diào)用分為絕對(duì)路徑和相對(duì)路徑,
- 絕對(duì)路徑
windows下:
path = "file://D:\TestFile\Cat\" + Number + ".png";
這種寫法玄坦,因?yàn)樾备苄枰D(zhuǎn)移血筑,所以這里是雙斜杠,不然報(bào)語(yǔ)法錯(cuò)誤煎楣,有些時(shí)候沒(méi)寫雙斜杠但又不報(bào)語(yǔ)法錯(cuò)豺总,但是路徑是錯(cuò)誤的,就很難發(fā)現(xiàn)問(wèn)題择懂。
所以建議用另外一種寫法:
@"file:///D:\TestFile\Cat" + Number + ".png";或者@"file://D:\TestFile\Cat" + Number + ".png";
file后面跟三個(gè)斜杠或者兩個(gè)斜杠都行喻喳。
安卓下:
path ="jar:file://"+PersistentDataPath(示例)+ Number + ".png";
注:因?yàn)樵诎沧肯聦?duì)unity來(lái)說(shuō)也只有PersistentDataPath,StreamingAssets這幾個(gè)路徑是可用的困曙,通常不會(huì)這么使用表伦,可以忽略,而且絕對(duì)路徑限制大慷丽,一般采用相對(duì)路徑蹦哼。 - 相對(duì)路徑
PC上:
url = Application.persistentDataPath + "/mydir/qq.txt";
或者
string path= Path.Combine(Application.persistentDataPath, fillName);
安卓下:
"file://" + Application.streamingAssetsPath + "\TestFile\Cat\" + Number + ".png";
"file://" + Application.PersistentDataPath+ "\TestFile\Cat\" + Number + ".png";
或者"file://" + Path.Combine(Application.persistentDataPath, fillName);
總之,路徑寫法的東西要糊,不行就多是一兩次就好了纲熏。