Unity對網絡資源更新加載管理設計

一、訴求

對於一些文件資源(圖片、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);

由於每次遇到的文件資源都不一樣,所以具體的細節就不展開講了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章