项目里面的许多资源都是从资源服务器加载的,这样子可以减小客户端的包大小。
所以我们需要一个专门的类来管理下载资源。
资源分很多类型,如:json表,txt文件,image文件,二进制文件,UIAtlas图集,AssetBundle等。
所以,首先创建一个管理资源文件类型的类LoadFileType。 其中文件类型可以用枚举来表示,也可以用类成员常量来表示。
此处使用类成员常量:
using 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
/** * 下载任务 * 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; } } } }