Unity游戏之网络图片下载与加载
2015-10-20 09:44
375 查看
很久没自己写博客了, 回来再准备写的时候,就回想起了自己刚刚接触unity的时候,真是感慨颇多啊!最近项目也进入测试阶段了,更多的时候是解决一些项目的BUG,留个自己的时间也多了。思考良久,猛然醒悟,拿起“笔墨纸砚”准备开始一段旅途,记录下项目中的“沿途风景”!
--------------------------------------------壁格线----------------------------------------
今天,我记录一下在网络游戏中的各种图片的下载和加载。想必大家也知道,任何的网游都需要加载各种图片,什么头像啊,活动和道具图片啊等等!为了降低包体的大小,提高图片使用的灵活性,我们未必需要把大量的图片存放在服务器中而不是本地。
说到下载,就必须先说一说WWW下载类,WWW是一个Unity开发中非常常用到的工具类,主要提供一般Http访问的功能,以及动态从网上下载图片、声音、视频Unity资源等。 主要支持的协议有:http://,https://,file://,ftp://(只支持匿名账号),其中file://便是访问本地文件。这里提几个WWW类用到的变量,其他的可以自行查看Unity的官方文档!
www.error:在下载过程中如果出现错误,则返回一个错误。
www.isDone:通常用来判断此次下载是否已经完成。
www.textrue:返回一个Texture2D产生的下载数据。
下来开始我们的下载工作。
在项目中,请求数据之后后台是传给我们一串json数据,然后我们需要反序列之后再取到其中的图片url,有时候我同事进行连续多张图片的下载,但这在WWW类中是不允许的,我们必须一次下载完一张图片才能进行下一张图片的下载。另外,从游戏性能和效率上来考虑,我们下载完一次的图片最好不再进行第二次的下载。那么综合以上的原因,我们首先需要一个图片Model类来存放一些数据。
准备工作完成以后,就可以进行下载工作了。
代码的其实也是很简单的,这里简单的解释一句,万一万一万一我自己下次都忘了呢!
在方法downloadPic里,主要做的就是一个简单的判断。首先判断url是否是在下载的list当中,如果存在,则判断它是否下载成功,成功则直接回调方法,不成功则将回调方法加入到model当中。当然若判断url不在list当中则直接加入到下载的list里。也不知道我说得清楚,反正意思就是那个样子咯!!!
方法loading是使用了一个协同程序类进行下载工作,主要完成的工作是下载后进行回调,下载失败就是要默认的图片来替补,当然下载失败的话我们不能坐视不管,你说对吧!?然后又是什么呢?!当然就是判断是否越界啊,我们最初是指定存放多少图片,如果超过了我们就删除它吧,图片存太多也不是一件好事情!
好了,今天就写到这里了。希望各位有什么意见或者我直白的有些错误都帮我提出来一下,大家一起讨论进行。哇哈哈哈哈哈!!!!!
--------------------------------------------壁格线----------------------------------------
今天,我记录一下在网络游戏中的各种图片的下载和加载。想必大家也知道,任何的网游都需要加载各种图片,什么头像啊,活动和道具图片啊等等!为了降低包体的大小,提高图片使用的灵活性,我们未必需要把大量的图片存放在服务器中而不是本地。
说到下载,就必须先说一说WWW下载类,WWW是一个Unity开发中非常常用到的工具类,主要提供一般Http访问的功能,以及动态从网上下载图片、声音、视频Unity资源等。 主要支持的协议有:http://,https://,file://,ftp://(只支持匿名账号),其中file://便是访问本地文件。这里提几个WWW类用到的变量,其他的可以自行查看Unity的官方文档!
www.error:在下载过程中如果出现错误,则返回一个错误。
www.isDone:通常用来判断此次下载是否已经完成。
www.textrue:返回一个Texture2D产生的下载数据。
下来开始我们的下载工作。
在项目中,请求数据之后后台是传给我们一串json数据,然后我们需要反序列之后再取到其中的图片url,有时候我同事进行连续多张图片的下载,但这在WWW类中是不允许的,我们必须一次下载完一张图片才能进行下一张图片的下载。另外,从游戏性能和效率上来考虑,我们下载完一次的图片最好不再进行第二次的下载。那么综合以上的原因,我们首先需要一个图片Model类来存放一些数据。
<pre name="code" class="csharp"> public class PictureModel{ public string url; //存放下载地址 public Texture2D texture2D; //存放下载后的图片 public Texture2D defaultTexture2D; //存放下载不成功的默认图片 public bool isDone = false; //标志一个图片是否已经下载完成 public List<ChangePicHandler> changePicHandlerList = new List<ChangePicHandler>(); //用于回调的委托。}
准备工作完成以后,就可以进行下载工作了。
public void downloadPic(string picUrl, ChangePicHandler change, Texture2D tex = null, bool isNewDown = false) { if(picUrl.Length==0) { change(tex); return; } if(isNewDown) { removePic(picUrl); } bool f = false; for (int i = 0; i < pictureModelList.Count; i++) { if (pictureModelList[i].url.Contains(picUrl) && picUrl != "") { if(pictureModelList[i].isDone) { change(pictureModelList[i].texture2D); } else { pictureModelList[i].changePicHandlerList.Add(change); } PictureModel pic = pictureModelList[i]; pictureModelList.Remove(pic); pictureModelList.Add(pic); f = true; break; } } if(!f) { PictureModel pictureModel = new PictureModel(); pictureModel.url = picUrl; pictureModel.isDone = false; pictureModel.changePicHandlerList.Clear(); pictureModel.texture2D = null; pictureModel.defaultTexture2D = tex; pictureModelList.Add(pictureModel); pictureModel.changePicHandlerList.Add(change); StartCoroutine(loading(pictureModel)); } } public IEnumerator loading(PictureModel pic) { WWW www = new WWW(pic.url); yield return www; if (www.isDone && www.error == null) { pic.texture2D = www.texture; for(int i = 0;i<pic.changePicHandlerList.Count;i++) { pic.changePicHandlerList[i](pic.texture2D); pic.changePicHandlerList.RemoveAt(i); i--; } pic.isDone = true; www.Dispose(); } else { if(pic.defaultTexture2D==null) { pic.texture2D = defaultTexture; } else { pic.texture2D = pic.defaultTexture2D; } for(int i = 0;i<pic.changePicHandlerList.Count;i++) { pic.changePicHandlerList[i](pic.texture2D); pic.changePicHandlerList.RemoveAt(i); i--; } pictureModelList.Remove(pic); www.Dispose(); } if (pictureModelList.Count > picMixCount) //判断数据是否超出定义的长度,如果超出执行删除操作 { removePic(); } }
代码的其实也是很简单的,这里简单的解释一句,万一万一万一我自己下次都忘了呢!
在方法downloadPic里,主要做的就是一个简单的判断。首先判断url是否是在下载的list当中,如果存在,则判断它是否下载成功,成功则直接回调方法,不成功则将回调方法加入到model当中。当然若判断url不在list当中则直接加入到下载的list里。也不知道我说得清楚,反正意思就是那个样子咯!!!
方法loading是使用了一个协同程序类进行下载工作,主要完成的工作是下载后进行回调,下载失败就是要默认的图片来替补,当然下载失败的话我们不能坐视不管,你说对吧!?然后又是什么呢?!当然就是判断是否越界啊,我们最初是指定存放多少图片,如果超过了我们就删除它吧,图片存太多也不是一件好事情!
好了,今天就写到这里了。希望各位有什么意见或者我直白的有些错误都帮我提出来一下,大家一起讨论进行。哇哈哈哈哈哈!!!!!
相关文章推荐
- 硬中断和软中断
- 数据包接收系列 — 上半部实现(网卡驱动)
- 用CornerStone配置SVN,HTTP及svn简单使用说明
- android中图片的三级cache策略(内存、文件、网络)
- 不错的网络协议栈测试工具 — Packetdrill
- Netfilter的使用和实现
- 数据包接收系列 — IP协议处理流程(二)
- Http权威指南笔记(二) Http状态码大全
- linux0.99网络模块-网络层(接收)
- 数据包接收系列 — IP协议处理流程(一)
- 数据包接收系列 — NAPI的原理和实现
- 数据包接收系列 — 下半部实现(软中断)
- tcpdump
- 数据包接收系列 — 上半部实现(内核接口)
- 卷积神经网络改进想法初探(上篇)
- 网络端口地址转换NAPT配置
- HttpClient如何访问需要提交客户端证书的SSL服务
- TCP三次握手和四次挥手
- Http1.0和http1.1
- 浅谈HTTP 中get 和post方式