項目里面的許多資源都是從資源服務器加載的,這樣子可以減小客戶端的包大小。
所以我們需要一個專門的類來管理下載資源。
資源分很多類型,如:json表,txt文件,image文件,二進制文件,UIAtlas圖集,AssetBundle等。
所以,首先創建一個管理資源文件類型的類LoadFileType。 其中文件類型可以用枚舉來表示,也可以用類成員常量來表示。
此處使用類成員常量:
[csharp]
view plaincopyusing UnityEngine;
using System.Collections;
namespace AssemblyCSharp {
public class LoadFileType {
public const string IMAGE = "image";
// unity3d文件格式
public const string UNITY3D = "unity3d";
// 模塊資源打包格式
public const string MODULE_RESOURCE = "moduleResource";
public const string BINARY = "binary";
public const string TXT = "txt";
public const string JSON = "json";
// fbx打包的assetBundle格式文件
public const string FBX = "fbx";
public const string AUDIO = "audio";
// 字體文件
public const string FONT = "font";
// 二進制文件(用于后臺更新)
public const string BINARY_BG = "binary_bg";
}
}
接下來需要創建一個類,用來管理單個下載任務,
Unity3D下載都是使用WWW來下載,我們要創建的類需要具有以下功能:
① 使用WWW下載資源。
② 具備委托回調接口,方便調用這個類的對象能夠接收到反饋,初步回調需要:下載完成后的回調,出現錯誤的回調,下載進程的回調。
③ 超時設置,超過一定時間則被認定下載任務失敗。
④ 除此之外,還需記錄本次下載任務的URL、以及所下載資源的fileType。
根據以上條件,這個類大致為:
// LoadReques.cs
[csharp]
view plaincopy/**
* 下載任務
* create by chensh 2014.10.27 10:31
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace AssemblyCSharp {
public class LoadRequest {
public delegate void DownCompleteDelegate(LoadParam param);
public delegate void ErrorDelegate(LoadRequest request);
public delegate void ProcessDelegate(float processValue, int fileTotalSize = 0);
public DownCompleteDelegate completeFunction;
public ErrorDelegate errorFunction;
public ProcessDelegate processFunction;
public const int TIME_OUT_FRAMES = 300;
private int _loadTotalFrames = 0; // 加載的總幀數
public bool isTimeOut = false;
public bool alreadyDeal = false;
public string requestURL;
public string fileType;
public WWW wwwObject = null;
public List<object> customParams = new List<object>();
public int priotiry = LoadPriority.NORMAL;
public LoadRequest(string url, object customParam = null, string type = "", DownCompleteDelegate completeFunc = null, ErrorDelegate errorFunc = null, ProcessDelegate processFunc = null) {
requestURL = url;
fileType = type;
completeFunction = completeFunc;
if (completeFunc != null)
customParams.Add(customParam);
if (errorFunc != null)
errorFunction = errorFunc;
if (processFunc != null)
processFunction = processFunc;
wwwObject = new WWW(requestURL);
wwwObject.threadPriority = ThreadPriority.Normal;
}
public int loadTotalFrames {
get {
return _loadTotalFrames;
}
set {
_loadTotalFrames = value;
if (_loadTotalFrames > LoadRequest.TIME_OUT_FRAMES)
isTimeOut = true;
}
}
}
}