서버에 있는 이미지는 그때그때 다운받아 쓰면 당연히도 로딩시간이 발생된다.
Assetbundle의 경우 캐시로 저장할 수 있지만 그 밖의 에셋들은 그러한 방식이 불가하다.
물론 모든 리소스들을 Assetbundle화 해도 되지만, 디바이스에 해당 Data를 저장하고, 불러와서 사용하도록 할 수 있다.
이때 쓸 수 있는 방식이 이미지캐싱이라는 방식이며, 몇가지 고려사항이 있다.
1. 다음을 Using해줘야 한다.
더보기
using System.IO;
using System;
2. 이미 파일이 저장되어 있는지 확인을 해야 한다.
1) 파일저장은 해당 경로가 있는지 여부로 확인한다.
더보기
File.Exists함수로 파일의 존재 여부를 알 수 있다. File.Exists("경로/파일명.확장자") 반환은 True, Flase이다. |
2. 없으면 다운로드 있으면, 해당 경로에서 가져와야 한다.
1) 있을 경우 해당 경로를 통한 파일을 활용한다.
더보기
if (File.Exists(checkDirectory + "/1.png")) //리소스 이미지 파일을 1.png을 찾는다. (이거는 임의로 지정한 파일명이다. 경로는 WWW주소와 동일하게 사용했다.)
{
Texture2D t = new Texture2D(ImageContents[i].Object.width, ImageContents[i].Object.height); // 불러오는 이미지를 넣어줄 메모리를 확보한다.
t.hideFlags = HideFlags.HideAndDontSave; // 속성을 미리 지정한다.
t.filterMode = FilterMode.Point; // 속성 지정
t.LoadImage(File.ReadAllBytes(checkDirectory + "/1.png")); // 캐시에 저장된 이미지를 Byte로 로드한다.)
ImageContents[i].Object.mainTexture = t; // 지정된 텍스쳐에 적용한다.
}
2) 없을 경우 다운로드하는 파일을 지정된 경로에 지정된 파일명으로 저장한다. (그래야 확인이 가능하며, 주로 WWW주소를 그대로 사용한다. (변환이 귀찮아서...))
더보기
WWW www = new WWW(convertURL(ImageContents[i].DrobBoxURL));
while (!www.isDone) //다운로드 프로그래스
{
Prograssbar.fillAmount = (1.0f / ImageContents.Length * i) + (www.progress / ImageContents.Length);
PrograssText.text = (Prograssbar.fillAmount * 100).ToString("F2") + "%";
yield return null;
}
ImageContents[i].Object.mainTexture = www.texture;
byte[] bytes = www.texture.EncodeToPNG();
DirectoryInfo di = new DirectoryInfo(checkDirectory);
di.Create();
File.WriteAllBytes(checkDirectory + "/1.png", bytes); // 파일이 저장될 경로를 다운로드 URL로 한뒤 1.png파일로 저장한다.
'Unity' 카테고리의 다른 글
유니티 외부 프로그램 실행 방법 (0) | 2020.07.20 |
---|---|
IL2CPP 에셋번들이 안읽혀 질때에.. (0) | 2020.06.22 |
콘텐츠 초기화 (0) | 2018.12.04 |
코루틴 : 유니티 게임 오브젝트가 사라질 경우 (0) | 2018.11.09 |
Unity Android 빌드 오류 : Manifast error (0) | 2017.07.30 |