Develop/Unity

Unity Image Cache 사용하기

dlsdnd345 2016. 2. 13. 20:24

Unity Image Cache 사용하기


​안녕하세요 . Unity 에서 페이스북 친구목록을 불러오는 과정에서 Unity UIScrollView 를 사용하게 되었습니다 . 

페이스북 api 를 통해서 친구목록을 불러와서 UIScrollView 뿌려 주니 아이템 셀이 삭제 될때마다 

이미지가 깜박이는 경우가 생겼습니다 . 처음에는 코루틴때문에 그런가 싶어서 Stop 코루틴으로 해결해 보려 했으나 ,

제 안드로이드 경험으로 생각해 봤을때 캐싱 처리가 안된거 같아 Cache 를 사용해서 처리 해보니 

이미지가 깜박이지 않고 잘 나오는것을 볼 수 있었습니다 .


http://studiofive27.com/index.php/unity-cached-web-images/


위 링크를 통해 들어가보면 Image CaChe 관련해서 작업해놓으신 분이 있습니다 .


이미지 캐싱을 사용하기 위한 클래스 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
 
public class WebTextureCache : MonoBehaviour
{
    private Dictionary<string, Texture2D> imageCache = new Dictionary<string, Texture2D> ();
    private Dictionary<string, WWW> requestCache = new Dictionary<string, WWW> ();
    private static WebTextureCache instance = null;
 
    /// <summary>
    /// Instantiates a global instance of this object in the scene
    /// </summary>
    /// <param name='name'>What to name the new global object </param>
    public static WebTextureCache InstantiateGlobal (string name = "WebTextureCache")
    {
        if (instance == null) {
            var gameobject = new GameObject (name);
            gameobject.AddComponent<WebTextureCache> ();
            instance = gameobject.GetComponent<WebTextureCache> ();
        }
 
        return instance;
    }
 
    public IEnumerator GetTexture (string url, Action<Texture2D> callback)
    {
        if (!this.imageCache.ContainsKey (url)) {
            int retryTimes = 3; // Number of time to retry if we get a web error
            WWW request;
            do {
                --retryTimes;
                if (!this.requestCache.ContainsKey (url)) {
                    // Create a new web request and cache is so any additional
                    // calls with the same url share the same request.
                    this.requestCache [url] = new WWW (url);
                }
 
                request = this.requestCache [url];
                yield return request;
 
                // Remove this request from the cache if it is the first to finish
                if (this.requestCache.ContainsKey (url)&& this.requestCache [url] == request) {
                    this.requestCache.Remove (url);
                }
            } while(request.error != null && retryTimes >= 0);
 
            // If there are no errors add this is the first to finish,
            // then add the texture to the texture cache.
            if (request.error == null && !this.imageCache.ContainsKey (url)) {
                this.imageCache [url] = request.texture;
            }
        }
 
        if (callback != null) {
            // By the time we get here there is either a valid image in the cache
            // or we were not able to get the requested image.
            Texture2D texture = null;
            this.imageCache.TryGetValue (url, out texture);
            callback (texture);
        }
    }
}

 

 

 

​캐싱 클래스는 사용하는 방법 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using UnityEngine;
using System.Collections;
 
public class WebImageDisplayCached : MonoBehaviour
{
    public UITexture sprite;
    public string imageUrl = "http://tinyurl.com/cds23w5";
 
    void Start ()
    {
        if (sprite == null) {
            sprite = GetComponent<UITexture> ();
            if (sprite == null) {
                return;
            }
        }
 
        var textureCache = WebTextureCache.InstantiateGlobal ();
        StartCoroutine (textureCache.GetTexture (imageUrl, LoadImage));
    }
 
    public void LoadImage (Texture2D texture)
    {
        if (texture != null) {
            Shader shader = Shader.Find ("Unlit/Transparent Colored");
            if (shader != null) {
                var material = new Material (shader);
                material.mainTexture = texture;
                sprite.material = material;
                sprite.color = Color.white;
                sprite.MakePixelPerfect ();
            }
        }
    }
}

 

 

 

위 코드에서 StartCoroutine (textureCache.GetTexture (imageUrl, LoadImage));

 

​이부분이 핵심 코드입니다 . 

첫번째 인자 : 받아올 이미지 Url  

두번째 인자 : 받아온 이미지를 넘겨줄 콜백 메서드 


위코드를 실행하면 Url 을 통해서 받아온 이미지를 LoadImage 파라미터로 넘겨주고 실행하는것을 

볼 수 있습니다 .


넘어온 이미지를 , Texture 를 통해서 보여주면 이쁘게 나오는 친구 목록을 볼 수 있습니다 .