Unity游戏之网络图片下载与加载

      很久没自己写博客了, 回来再准备写的时候,就回想起了自己刚刚接触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类来存放一些数据。 

       
 public class PictureModel{
        public string url;   //存放下载地址
        public Texture2D texture2D;  //存放下载后的图片
	public Texture2D defaultTexture2D;  //存放下载不成功的默认图片
        public bool isDone = false;   //标志一个图片是否已经下载完成
        public List changePicHandlerList = new List(); //用于回调的委托。} 

           
  准备工作完成以后,就可以进行下载工作了。 
          
  
    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 picMixCount)    //判断数据是否超出定义的长度,如果超出执行删除操作
		{
			removePic();
		}   
	}

           代码的其实也是很简单的,这里简单的解释一句,万一万一万一我自己下次都忘了呢!

        在方法downloadPic里,主要做的就是一个简单的判断。首先判断url是否是在下载的list当中,如果存在,则判断它是否下载成功,成功则直接回调方法,不成功则将回调方法加入到model当中。当然若判断url不在list当中则直接加入到下载的list里。也不知道我说得清楚,反正意思就是那个样子咯!!!

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

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

                Unity游戏之网络图片下载与加载_第1张图片

        

    

         

你可能感兴趣的:(Unity游戏开发)