您的位置:首页 > 理论基础 > 计算机网络

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类来存放一些数据。 

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

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

               


        

    

         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: