一、訴求
對於一些文件資源(圖片、word、Excel、PPT、視頻等),放再程序裏會增加包體的大小,所以需要把資源放在服務器。
實現的需求有:
1)從網加載資源,並保存到本地,後面就從本地加載
2)有更新機制,當網絡上的資源更新後,要從新下載替換本地資源
二、思路分析
1.文件經常是分幾個層級保存起來的,所以要知道某個文件夾或模塊下有哪些資源文件的話,我們就需要一個配置文本,把每個層級對應的文件記錄在文本中。
2.爲了校驗是否有更新,可以把每個文件記錄一個MD5值一併保存起來。
3.加載時的大致流程如下:
三、實現
1.生成校驗腳本
示例案例文件層級結構大致如下
以此做一個對象來存儲文件結構信息
public class OperationFileDatas {
public List<OperationFileData> chineseDataList = new List<OperationFileData>();
public List<OperationFileData> englistDataList = new List<OperationFileData>();
}
public class OperationFileData
{
public string operationName = string.Empty;
public List<DataInfo> dataInfos = new List<DataInfo>();
}
public class DataInfo
{
public string fileName = string.Empty;
public string md5Str = string.Empty;
}
通過對文件夾的遍歷得到數據對象,這裏生成的校驗碼生成使用了文件大小和文件名
OperationFileDatas operationFileDatas = new OperationFileDatas();
string[] language = new string[] { "Chinese", "English" };
for (int m = 0; m < language.Length; m++)
{
DirectoryInfo operationInfo = new DirectoryInfo(GMConfig.streamAssetFilePath + language[m]);
DirectoryInfo[] operationDirList = operationInfo.GetDirectories();
for (int i = 0; i < operationDirList.Length; i++)
{
OperationFileData operationFileData = new OperationFileData();
operationFileData.operationName = operationDirList[i].Name;
Debug.Log(operationDirList[i].Name);
string[] filePathList = Directory.GetFiles(operationDirList[i].FullName);
if (filePathList.Length > 0)
{
for (int j = 0; j < filePathList.Length; j++)
{
DataInfo dataInfo = new DataInfo();
string fileName = filePathList[j].Substring(filePathList[j].LastIndexOf("\\") + 1);
if (Path.GetExtension(fileName).Equals(".meta"))
{
continue;
}
dataInfo.fileName = fileName;
byte[] fuleByt = File.ReadAllBytes(filePathList[m]);
Debug.Log(fileName + " " + fuleByt.Length);
dataInfo.md5Str = GMMD5Creater.EncryptDES(fileName + fuleByt.Length.ToString());
operationFileData.dataInfos.Add(dataInfo);
}
}
if (language[m].Equals("Chinese"))
{
operationFileDatas.chineseDataList.Add(operationFileData);
}
else
{
operationFileDatas.englistDataList.Add(operationFileData);
}
}
}
把對象數據轉爲文本
JsonConvert.SerializeObject(operationFileDatas)
這個使用到了Newtonsoft.Json 下載鏈接:https://download.csdn.net/download/YasinXin/12533117
最後把文本保存起來
static void ExportIndexFile(string json, string fileName, string savepath)
{
if (!json.Equals(string.Empty))
{
if (!Directory.Exists(savepath))
{
Directory.CreateDirectory(savepath);
}
savepath += fileName;
FileStream fs = new FileStream(savepath, FileMode.Create);
byte[] bytes = new UTF8Encoding().GetBytes(json);
//寫入會把文本清空寫入bytes內容
fs.Write(bytes, 0, bytes.Length);
fs.Close();
}
else
MessageBoxes.NoAssetsFound();
AssetDatabase.Refresh();
}
這樣校驗文本就生成好了,局部效果如下
2.加載資源
通過配置文本的到每個模塊下有哪些資源,再拼成路徑逐個加載,加載的方法參上面的流程圖。
網絡加載及進度顯示
UnityWebRequest request = UnityWebRequest.Get(webPath);
request.SendWebRequest();//開始請求
while (!request.isDone)
{
Debug.Log(Math.Floor(request.downloadProgress * 100) + "%");
yield return 1;
}
if (request.isDone)
{
Debug.Log(100 + "%");
}
if (request.isNetworkError || request.isHttpError)
{
UnityEngine.Debug.LogError(webPath);
UnityEngine.Debug.LogError(request.error);
}
else
{
var file = request.downloadHandler.data;
//加載成功的邏輯處理
...
yield break;
}
這裏的幾種文件都可以先下載到本地再讀取,視頻也可以直接用流媒體方式播放。
在Unity中打開其它文件,如:Excel、Word、PPT等可以使用
Process.Start(url);
由於每次遇到的文件資源都不一樣,所以具體的細節就不展開講了。