我们已经开发了在移动终端中,异步网络图片被装入多,在unity其中尽管AssetBundle存在,通常第一个好游戏的资源,然后加载到现场,但也有很多地方可以使用异步网络加载图像以及其缓存机制。
我也写了两个版本的数字前ios异步加载网络helper类,所以今天依照相同的思路。也想做一个好用的helper类给大家使用以及简单的说下实现原理。
首先我们载入一张网络图片。要做的事情分步来讲为:
0.開始之前设置一张固定的图片作为占位图(placeholder),表示我们的图片还没载入好。来填充当前图片控件区域,让用户知道
1.这个图片有个url地址,我们的程序第一次载入这个url地址的图片时
a.异步開始下载这张图片
b.保存到某个指定的文件夹
c.将图片控件上占位图替换为下载好的图片。能够适当的加入图片切换动画(动画本文略)
2.我们的程序已经载入过这个url地址的图片
a.从上次存进的文件夹中读取文件。转换为图片
b.将图片控件上占位图替换为下载好的图片
总的来说我们的程序应该是在第一次载入一批网络图片的时候,是须要哪张下哪张,然后显示出来,而后,是能够直接从文件系统中去读取的(第三种情况,从内存中直接读取。取决于设备配置。这里就不做了)
開始做这个工具类之前,先要知道一些unity的特殊限制:
1.MonoBehaviour基类的成员方法 StartCoroutine开启异步任务是不支持静态方法中调用的
2.MonoBehaviour基类的子类不能直接使用keywordnew 来创建,对应的。须要创建一个空的GameObject,然后调用这个object的AddComponent方法来实例化,也就是说unity中的脚本对象都依附于游戏对象才干被运行
3.因为unity的跨平台特性。每一个不同的平台的文件文件夹结构有差别
基于上述一些特殊性。我打算把这个工具类作成一个MonoBehaviour的子类,并以单例的形式让其它脚本调用。当中的异步网络请求就能够使用StartCoroutine函数了
首先是这个单例的实现方法:
using UnityEngine;
using System.Collections;
using System.IO; public class AsyncImageDownload :MonoBehaviour { public Texture placeholder;
public static AsyncImageDownload Instance=null; private string path=Application.persistentDataPath+"/ImageCache/" ; //构建单例
public static AsyncImageDownload CreateSingleton()
{
if (!Directory.Exists(Application.persistentDataPath+"/ImageCache/")) {
Directory.CreateDirectory(Application.persistentDataPath+"/ImageCache/");
} GameObject obj = new GameObject ();
obj.AddComponent<AsyncImageDownload> (); AsyncImageDownload loader= obj.GetComponent<AsyncImageDownload>();
Instance=loader;
loader.placeholder=Resources.Load("placeholder") as Texture;
return loader; }
这里没有使用构造函数来创建单例,原因是MonoBehaviour的子类压根不支持newkeyword,所以怎么去写构造函数呢
然后这个构建单例的方法是跟构造方法差点儿相同的,仅仅是不是去new出来。而是类名.方法名()来创建这个单例,在创建单例的时候须要创建一个空白游戏体来依附我们的脚本组件,而且把静态成员Instance指向创建出来的这个单例,多次使用这个单例的时候仅仅须要使用 类名.Instance()来获取已经存在的这个脚本组件单例。
这里的Resources.Load(“placeholder”)须要注意,用代码读取项目文件夹中的图片资源并转换成Texutre对象,须要再Project窗体下的Assets中创建Resources文件夹,然后导入不论什么一张图片进去,代码中获取他不须要加后缀名。
这个脚本写好以后。我们的程序初始化的时候应该运行下面代码来创建这个单例:
AsyncImageDownload.CreateSingleton()
而后,给某个控件载入网络图片。我们应该给这个单例加一个方法public void SetAsyncImage(string url,UITexture texture),那么简化的写法就能够写为:
AsyncImageDownload.Instance.SetAsyncImage ("http://www.cfanz.cn/uploads/jpg/2013/07/13/0/XEPLd7d2C5.jpg", page.GetComponentInChildren<UITexture> ());
这种做法将在本博客第二部分在完成