我们已经开发了在移动终端中,异步网络图片被装入多,在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> ());

这种做法将在本博客第二部分在完成


Unity+NGUI打造网络图片异步加载和本地缓存工具(一)的更多相关文章

  1. Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

    加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行:2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载. 一. ...

  2. android异步加载图片并缓存到本地实现方法

    图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片     在android项目中访问网络图片是非常普遍性的事 ...

  3. [原创]cocos2dx加载网络图片&异步加载图片

    [动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到 ...

  4. 基于 unity ngui 上的滚动加载__UiVirtual

    在游戏里面经常会有背包,好友,对话,这样的列表.当列表的内容多了,如果一打开界面就对所有内容进行实例化,会消耗大量的性能,且会造成UI上的卡顿. 于是便需要,在列表里面只实例化屏幕上可见的item.屏 ...

  5. android图片的异步加载和双缓存学习笔记——DisplayImageOptions (转)

    转的地址:http://hunankeda110.iteye.com/blog/1897961 1 //设置图片在下载期间显示的图片 2 showStubImage(R.drawable.ic_lau ...

  6. windows phone 8.0 的网络图片异步加载方案

    买了一本林政的8.1UI的书,看到一个使用弱引用对像来解决图片缓存的问题,刚好自已写的应用也遇到这个问题,于是小改动了一下代码,搬到了8.0版本来使用,代码由 zhxilin℃+ 大神提供了部分解决代 ...

  7. 关于ios异步加载图片的几个开源项目

    一.HjCache  原文:http://www.markj.net/hjcache-iphone-image-cache/ 获取 HJCache: HJCache is up on github h ...

  8. Android ListView 图片异步加载和图片内存缓存

    开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...

  9. Android图片管理组件(双缓存+异步加载)

    转自:http://www.oschina.net/code/snippet_219356_18887?p=3#comments ImageManager2这个类具有异步从网络下载图片,从sd读取本地 ...

随机推荐

  1. 自定义错误页面mvc用法

    原谅我这个新手,对大神们来说这么简单的问题,竟折腾了我一个上午,仅此文章做个记录,供以后备用. 自定义错误页面(custom error pages)在asp.net webform里的配置请看htt ...

  2. C++习题 对象数组求最大值

    Description 建立一个对象数组,内放n(<10)个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出n个学生中成绩最高者,并输出其学号. In ...

  3. 分布式搜索elasticsearch 文献检索索引 入门

    1.首先,例如,下面的数据被提交给ES该指数 {"number":32768,"singer":"杨坤","size": ...

  4. HDU 5059 Help him(细节)

    HDU 5059 Help him 题目链接 直接用字符串去比較就可以,先推断原数字正确不对,然后写一个推断函数,注意细节,然后注意判掉空串情况 代码: #include <cstdio> ...

  5. 使用Canvas和Paint自己绘制折线图

    主要用于Canvas一个特别简单的小demo. 能够手动点击看每一个月份的数据.很easy.就是用paint在canvas上画出来的. 主要内容就是计算左边价格的位置,以下日期的位置,三根虚线的位置, ...

  6. [MySQL]--&gt;询5 几天之内解决在新年发行一个同事的生日过程

    前言:        遇到朋友提问,例如以下:SELECT * FROM ali_users WHERE  DATEDIFF(CAST(CONCAT(DATE_FORMAT(NOW(),'%y'),D ...

  7. 【微信公众平台开发】百度周边搜索接口php封装

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl2YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  8. HDU 1026 Ignatius and the Princess I 迷宫范围内的搜索剪枝问题

    这个问题是一个典型的类型的问题迷宫广泛的搜索. 在网上看到了很多解决方案. 没什么解决问题的分析报告,不指出其中的关键点.代码更像是一大抄.一些分析师也有很大的文章分析.只是不要全部命中关键,什么是广 ...

  9. android JNI 简单demo(2)它JNI demo 写

    android JNI 简单demo(2)它JNI demo 写 一.搭建Cygwin 环境:http://blog.csdn.net/androidolblog/article/details/25 ...

  10. SQL开发中容易忽视的一些小地方(五)

    原文:SQL开发中容易忽视的一些小地方(五) 背景: 索引分类:众所周知,索引分为聚集索引和非聚集索引. 索引优点:加速数据查询. 问题:然而我们真的清楚索引的应用吗?你写的查询语句是否能充分应用上索 ...