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是使用了一个协同程序类进行下载工作,主要完成的工作是下载后进行回调,下载失败就是要默认的图片来替补,当然下载失败的话我们不能坐视不管,你说对吧!?然后又是什么呢?!当然就是判断是否越界啊,我们最初是指定存放多少图片,如果超过了我们就删除它吧,图片存太多也不是一件好事情!

         好了,今天就写到这里了。希望各位有什么意见或者我直白的有些错误都帮我提出来一下,大家一起讨论进行。哇哈哈哈哈哈!!!!!

               

        

    

         

1 0