1. 程式人生 > >從伺服器下載資源一

從伺服器下載資源一

專案裡面的許多資源都是從資源伺服器載入的,這樣子可以減小客戶端的包大小。

所以我們需要一個專門的類來管理下載資源。

資源分很多型別,如:json表,txt檔案,image檔案,二進位制檔案,UIAtlas圖集,AssetBundle等。

所以,首先建立一個管理資原始檔型別的類LoadFileType。 其中檔案型別可以用列舉來表示,也可以用類成員常量來表示。

此處使用類成員常量:

  1. using UnityEngine;  
  2. using System.Collections;  
  3. namespace AssemblyCSharp {  
  4.     publicclass LoadFileType {  
  5.         publicconststring IMAGE = "image";  
  6.         // unity3d檔案格式
  7.         publicconststring UNITY3D = "unity3d";  
  8.         // 模組資源打包格式
  9.         publicconststring MODULE_RESOURCE = "moduleResource";  
  10.         publicconststring BINARY = "binary";  
  11.         publicconststring TXT = "txt";  
  12.         public
    conststring JSON = "json";  
  13.         // fbx打包的assetBundle格式檔案
  14.         publicconststring FBX = "fbx";  
  15.         publicconststring AUDIO = "audio";  
  16.         // 字型檔案
  17.         publicconststring FONT = "font";  
  18.         // 二進位制檔案(用於後臺更新)
  19.         publicconststring BINARY_BG = "binary_bg";  
  20.     }  
  21. }  


接下來需要建立一個類,用來管理單個下載任務,

Unity3D下載都是使用WWW來下載,我們要建立的類需要具有以下功能:

① 使用WWW下載資源。

② 具備委託回撥介面,方便呼叫這個類的物件能夠接收到反饋,初步回撥需要:下載完成後的回撥,出現錯誤的回撥,下載程序的回撥。

③ 超時設定,超過一定時間則被認定下載任務失敗。

④ 除此之外,還需記錄本次下載任務的URL、以及所下載資源的fileType。

根據以上條件,這個類大致為:

// LoadReques.cs

  1. /** 
  2.  * 下載任務 
  3.  * create by chensh 2014.10.27 10:31 
  4.  */
  5. using UnityEngine;  
  6. using System.Collections;  
  7. using System.Collections.Generic;  
  8. namespace AssemblyCSharp {  
  9.     publicclass LoadRequest {  
  10.         publicdelegatevoid DownCompleteDelegate(LoadParam param);  
  11.         publicdelegatevoid ErrorDelegate(LoadRequest request);  
  12.         publicdelegatevoid ProcessDelegate(float processValue, int fileTotalSize = 0);  
  13.         public DownCompleteDelegate completeFunction;  
  14.         public ErrorDelegate errorFunction;  
  15.         public ProcessDelegate processFunction;  
  16.         publicconstint TIME_OUT_FRAMES = 300;  
  17.         privateint _loadTotalFrames = 0; // 載入的總幀數
  18.         publicbool isTimeOut = false;  
  19.         publicbool alreadyDeal = false;  
  20.         publicstring requestURL;  
  21.         publicstring fileType;  
  22.         public WWW wwwObject = null;  
  23.         public List<object> customParams = new List<object>();  
  24.         publicint priotiry = LoadPriority.NORMAL;  
  25.         public LoadRequest(string url,  object customParam = nullstring type = "", DownCompleteDelegate completeFunc = null, ErrorDelegate errorFunc = null, ProcessDelegate processFunc = null) {  
  26.             requestURL = url;  
  27.             fileType = type;  
  28.             completeFunction = completeFunc;  
  29.             if (completeFunc != null)  
  30.                 customParams.Add(customParam);  
  31.             if (errorFunc != null)   
  32.                 errorFunction = errorFunc;  
  33.             if (processFunc != null)   
  34.                 processFunction = processFunc;  
  35.             wwwObject = new WWW(requestURL);  
  36.             wwwObject.threadPriority = ThreadPriority.Normal;  
  37.         }  
  38.         publicint loadTotalFrames {  
  39.             get {  
  40.                 return _loadTotalFrames;  
  41.             }  
  42.             set {  
  43.                 _loadTotalFrames = value;  
  44.                 if (_loadTotalFrames > LoadRequest.TIME_OUT_FRAMES)  
  45.                     isTimeOut = true;  
  46.             }  
  47.         }  
  48.     }  
  49. }