1、Unity中各路徑和目錄的對應關系
image.png
其中,安卓中的路徑是有兩種分支的
image.png
在打包面板中,有個Write Access
當我們選擇Internal Only就是表示沙盒路徑,/data/data/com.xxx.xxx/
對應的Android方法為 getFilesDir()
當我們選擇SDCard時就表示存儲到SD卡上,: /storage/emulated/0/Android/data/com.example.myapplication/files
2、各個路徑的特點
Resources
是作為一個Unity的保留文件夾出現的,也就是如果你新建的文件夾的名字叫Resources,那么里面的內容在打包時都會被無條件的打到發布包中。
特點:
只讀,即不能動態修改。所以想要動態更新的資源不要放在這里。
會將文件夾內的資源打包集成到.asset文件里面。因此建議可以放一些Prefab,因為Prefab在打包時會自動過濾掉不需要的資源,有利于減小資源包的大小。
資源讀取使用Resources.Load()。
任何平臺都可以用File讀取
StreamingAssets
StreamingAssets和Resources很像。同樣作為一個只讀的Unity3D的保留文件夾出現。不過兩者也有很大的區別,那就是Resources文件夾中的內容在打包時會被壓縮和加密。而StreamingAsset文件夾中的內容則會原封不動的打入包中,因此StreamingAssets主要用來存放一些二進制文件。在任何平臺中總可以統一使用Application.streamingAssetsPath 屬性來獲得這一文件夾路徑。
特點:
PC端可讀寫,移動端只讀不可寫。
主要用來存放二進制文件,配置文件。
注意,在Android中,StreamingAssets中的文件包含在一個.jar壓縮文件(基本上與標準的zip為統一格式)中,所以移動端時只能用過UnityWebRequest類來讀取。在PC下,可以用File類API(如File.ReadAllText)讀寫StreamingAssets文件夾中的文件;在IOS和Android平臺下,不能用File類API讀取。
任何平臺都可以用www方式異步讀取該文件夾內容。PC和IOS平臺下,讀取路徑必須加上"file://",而安卓不需要。
在IOS和Android下,還能用AssetBundle.LoadFromFile來同步讀取數據。
PersistentDataPath
這個路徑下是可讀寫。而且在IOS上就是應用程序的沙盒,但是在Android可以是程序的沙盒,也可以是sdcard。并且在Android打包的時候,ProjectSetting頁面有一個選項Write Access,可以設置它的路徑是沙盒還是sdcard。
特點:
-可讀寫,不過只能運行時才能寫入或者讀取。 提前將數據存入這個路徑是不可行的。
無內容限制。你可以從 StreamingAsset 中讀取二進制文件或者從 AssetBundle 讀取文件來寫入 PersistentDataPath 中。
寫下的文件,可以在電腦上查看。同樣也可以清掉。
可以使用UnityWebRequest類來讀取。
可以用File類API(如File.ReadAllText)讀寫PersistentDataPath文件夾中的文件(安卓下唯一可以用File類的路徑)
Application.DataPath
注意移動端是沒有訪問權限的
3、Unity文件的讀寫方式
幾個文件操作類介紹
1、File類和FileInfo類的介紹:
File類和FileInfo類都是提供用于創建、復制、刪除、移動和打開文件的方法,一個是靜態的,一個是實例方法。簡單來說,就是Flie類可以直接通過類名調用其中的某些函數,而FileInfo類需要先實例化一個對象,再通過對象調用函數。一般來說,如果是對文件進行少量的操作,則建議用File類,如果是對文件進行大量的存取操作,建議用FileInfo類,具體原因參照這 。 這里是官方的文檔,File類, FileInfo類。
2、FileStream類和StreamWriter,StreamReader類的簡單介紹:
FileStream類是一個操作類,FileStream 對象表示在磁盤或網絡路徑指向文件的流,這個類提供了在文件中讀寫字節的方法。簡單來說就是這個Filestream這個文件流對 .txt等文件讀寫內容時需要使用的一個工具。如果File類是一個總的文件的話,那么fileStream類就是對文件進行操作的筆。 FileStream類和StreamWriter,StreamReader類的區別在于FileStream類操作的是字節和字節數組,而StreamWriter等類操作的是字符數據。StreamWriter類操作的只能是文本類型的,而FileStream類的對象可以是任何類型的。操作文本的話用StreamWriter等比較方便。
下面是用File和FileInfo兩種方式去創建文件,以及用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+"//"+file_name))
{
sw=File.CreateText(file_path+"//"+file_name);//創建一個用于寫入 UTF-8 編碼的文本
Debug.Log("文件創建成功!");
}
else
{
sw=File.AppendText(file_path+"//"+file_name);//打開現有 UTF-8 編碼文本文件以進行讀取
}
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+"//"+file_name);
if(!file_info.Exists)
{
sw=file_info.CreateText();//創建一個用于寫入 UTF-8 編碼的文本
Debug.Log("文件創建成功!");
}
else
{
sw=file_info.AppendText();//打開現有 UTF-8 編碼文本文件以進行讀取
}
sw.WriteLine(str_info);
sw.Close ();
sw.Dispose ();//文件流釋放
}
4、Unity路徑解疑
上面了解各個路徑的特性,讀寫方式,但是還有一個經常容易犯錯的地方,就是路徑的寫法。
Unity3D關于路徑資源的調用分為絕對路徑和相對路徑,
絕對路徑
windows下:
path = "file://D:\TestFile\Cat\" + Number + ".png";
這種寫法,因為斜杠需要轉移,所以這里是雙斜杠,不然報語法錯誤,有些時候沒寫雙斜杠但又不報語法錯,但是路徑是錯誤的,就很難發現問題。
所以建議用另外一種寫法:
@"file:///D:\TestFile\Cat" + Number + ".png";或者@"file://D:\TestFile\Cat" + Number + ".png";
file后面跟三個斜杠或者兩個斜杠都行。
安卓下:
path ="jar:file://"+PersistentDataPath(示例)+ Number + ".png";
注:因為在安卓下對unity來說也只有PersistentDataPath,StreamingAssets這幾個路徑是可用的,通常不會這么使用,可以忽略,而且絕對路徑限制大,一般采用相對路徑。
相對路徑
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);
總之,路徑寫法的東西,不行就多是一兩次就好了。