1.Resources 路徑 只讀 不能動(dòng)態(tài)的修改
存放內(nèi)容 預(yù)制體(prefabs) - 不容易變化的預(yù)制體
prefabs打包的時(shí)候 會(huì)自動(dòng)過(guò)濾不需要的資源 有利于減小資源大小
主線程加載
Resources類的Load方法
文件夾中的內(nèi)容打包的時(shí)候會(huì)被壓縮和加密
2.streamingAssetsPath 內(nèi)容會(huì)原封不動(dòng)的打入包中
一般建議存放一些二進(jìn)制文件 (配置文件,unity資源包(AB文件)等)
特點(diǎn)
只讀 不可寫(xiě)
主要存放二進(jìn)制文件
通過(guò)WWW類 讀取文件(移動(dòng)端)
3.persistentDataPath 特殊路徑 唯一可讀寫(xiě)的路徑
這個(gè)路徑在IOS平臺(tái)是 應(yīng)用程序的沙盒
但是在安卓Android平臺(tái)上 它可以是程序的沙盒 也可以是SDcard
并且在打包輸出的時(shí)候可以設(shè)置為沙盒或者SDcard
projectsettings - otherSettings - writePermission
可讀寫(xiě) 不同平臺(tái)路徑不同 這個(gè)路徑下的文件夾 首次運(yùn)行程序時(shí)自動(dòng)創(chuàng)建
熱更新解決方案 將易變資源 還有邏輯 (1.0版本)放在streamingAssetsPath(資源包AB文件 配置表 Lua文本文件)
從網(wǎng)絡(luò)端下載版本文件 讀取出數(shù)據(jù) 對(duì)比當(dāng)前服務(wù)器版本和本地版本版號(hào) 例如1.1版本 從服務(wù)器下載最新版本
更新的內(nèi)容 大小等相關(guān)數(shù)據(jù) MD5驗(yàn)證
包含游戲數(shù)據(jù)文件夾的路徑 只讀 - D:/Unity/SaveData/Assets
Debug.Log(Application.dataPath);
包含一個(gè)到StreamingAssets文件夾的路徑 只讀 - D:/Unity/SaveData/Assets/StreamingAssets
Debug.Log(Application.streamingAssetsPath);
包含一個(gè)持久數(shù)據(jù)目錄的路徑(只讀) unity唯一的可讀寫(xiě)路徑 C:/Users/Administrator/AppData/LocalLow/DefaultCompany/Space Shooter
Debug.Log(Application.persistentDataPath);
Application.streamingAssetsPath 兩種加載方式
引入命名空間 system.io;
void ReadData() {
string fileAddress = Path.Combine(Application.streamingAssetsPath, "Test.txt");
FileInfo m_info = new FileInfo(fileAddress);
string str = "";
if (m_info.Exists) {
StreamReader strR = new StreamReader(fileAddress);
str = strR.ReadToEnd();
Debug.Log("str = " + str);
}
}
// 通過(guò)WWW加載
string _dataStr;
IEnumerator LoadWWW() {
string path = Application.streamingAssetsPath + "/Test.txt";
if ( !path.Contains("file://") ) {
path = "file://" + path;// 必須要加 確保必須要加
}
WWW www = new WWW(path);
yield return www;
// 加載完成
_dataStr = www.text;
Debug.Log("_dataStr = " + _dataStr);
}
熱更新原理
string test = "Test.txt";// 帶文件后綴
string test_1 = "Test_1.txt";
private void Start()
{
string[] paths = new string[] {
test,
test_1
// 添加其他需要拷貝的數(shù)據(jù)
};
LoadByPath(paths);
}
// 根據(jù)多個(gè)文件路徑加載并拷貝數(shù)據(jù)
private void LoadByPath(string[] paths)
{
StartCoroutine(CopyFile(paths));
}
協(xié)程
public IEnumerator CopyFile(string[] paths)
{
for (int i = 0; i < paths.Length; ++i) {
string fileName = paths[i];
string streamPath = Path.Combine(Application.streamingAssetsPath, fileName);
if (!streamPath.Contains("file://")) {
streamPath = "file://" + streamPath;
}
WWW www = new WWW(streamPath);
yield return www; //等待www對(duì)象加載完成
// 將讀取的數(shù)據(jù)寫(xiě)入沙盒文件夾 以備后續(xù)邏輯調(diào)用
string writePath = Path.Combine(Application.persistentDataPath, fileName);
WriteByPath(www.bytes,writePath);
}
}
寫(xiě)數(shù)據(jù)的方法 (將數(shù)據(jù)寫(xiě)入沙盒路徑)
private void WriteByPath(byte[] bytes, string writePath)
{
// 判斷文件(這里是Test.txt是否存在) 防止老版本覆蓋新版本
if (!File.Exists(writePath)) {
// 寫(xiě)數(shù)據(jù)
FileStream stream = new FileStream(writePath,FileMode.Create);
stream.Write(bytes, 0, bytes.Length);
stream.Flush();// 釋放所有相關(guān)資源
stream.Close();// 關(guān)閉數(shù)據(jù)流
}
}