Unity游戏之网络图片下载与加载
来源:互联网 发布:gm游戏制作软件 编辑:程序博客网 时间:2024/05/18 09:26
很久没自己写博客了, 回来再准备写的时候,就回想起了自己刚刚接触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类来存放一些数据。
<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是使用了一个协同程序类进行下载工作,主要完成的工作是下载后进行回调,下载失败就是要默认的图片来替补,当然下载失败的话我们不能坐视不管,你说对吧!?然后又是什么呢?!当然就是判断是否越界啊,我们最初是指定存放多少图片,如果超过了我们就删除它吧,图片存太多也不是一件好事情!
好了,今天就写到这里了。希望各位有什么意见或者我直白的有些错误都帮我提出来一下,大家一起讨论进行。哇哈哈哈哈哈!!!!!
- Unity游戏之网络图片下载与加载
- 网络图片下载与缓存
- 网络通信之图片下载
- unity深入研究--之异步加载游戏场景与异步加载游戏资源进度条
- AsyncTask异步加载之图片下载
- iPhone网络图片下载之ABELWebImage
- 网络爬虫之批量图片下载
- Android 网络连接:Volley(齐射)之ImageRequest与NetworkImageView网络图片下载
- AsyncTask加载之图片下载(2)
- 网络图片下载
- 网络图片下载
- Unity 加载网络图片
- Unity 加载网络图片
- unity中异步加载游戏场景与异步加载游戏资源进度条
- Unity游戏加载页面处理
- Unity与游戏开发
- unity之游戏总结
- unity之游戏预热
- Objective-C Runtime 运行时之四:Method Swizzling
- 解决手机拍照问题
- WGS84,GCJ02, BD09坐标转换
- Sublime 插件
- Python 代码性能优化技巧
- Unity游戏之网络图片下载与加载
- 静态链表
- Cg per-vertex diffuse lighting
- 分页控件:pager-taglib与SpringMVC结合实例2
- linux上mysql无法删除数据库
- 几个常用的android studio 插件
- 线性表
- eclipse中配置tomcat
- Ant 打包war 生成文件内容build.xml