이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
이번 장은 빌드한 에셋번들을 서버로부터 다운로드하고 로드, 언로드 하는 방법에 대해서 배워보도록 하겠습니다. 빌드과정에 대한 이해를 바탕으로 하고 있으니 이전 두 장을 읽고 와주시길 바랍니다.
3. 에셋번들 다운로드와 로드
3. 에셋번들 다운로드와 로드
캐싱
에셋번들 다운로드에는 캐싱, 논캐싱 2가지 방법이 있습니다. 그럼 캐싱이란 무엇일까요? 이미 출시한 게임에 새로운 컨텐츠를 제공할 때 제공하는 DLC(Downlodable Contents)를 구현하거나, 대규모 게임에서 자주 업데이트가 발생할 경우 실행 파일과 에셋번들을 조합해 사용하는데 이 때마다 새롭게 네트워크에서 다운 받으면 네트워크의 속도 저하가 발생할 것 입니다. 그래서 아래 그림처럼 한번 다운로드 받은 파일은 하드디스크에 저장(캐싱)하고, 두 번째 부터는 네트워크가 아닌 하드디스크에서 바로 로드하는 것이 캐싱입니다.
에셋번들 다운로드
위에서 말씀드렸듯이, 다운로드의 방식에는 캐싱과 논캐싱 2가지 방법이 있습니다.
Non-caching : 이것은 새 WWW object(ScriptRef : WWW.WWW.html)을 만드는 것으로 할 수 있습니다. 에셋 번들은 로컬 저장 장치 Unity의 Cache 폴더에 캐시되지 않습니다.
Caching : 이것은 [WWW.LoadFromCacheOrDownload](ScriptRef : WWW.LoadFromCacheOrDownload.html)를 호출합니다. 에셋 번들은 로컬 저장 장치 Unity의 Cache 폴더에 캐시됩니다.
유니티에선 캐싱 방법으로 다운로드하는 것을 추천하기 때문에 캐싱 방법에 대해서만 다뤄보도록 하겠습니다. 웹 서버에 파일을 올려놓고 가져오는 방식으로 하겠습니다. 먼저, 2장에서 큐브 3개를 만들어서 프로젝트 뷰에 옮겨 프리팹을 만들었었죠? 이제 에셋번들에서 다운로드, 로드하여 불러올 것이기 때문에 비교를 위해 삭제해주겠습니다.
그리고 유니티 공식문서에서 제공한 캐싱 방법의 다운로드 코드를 가져와 사용해봅시다.
using System; using UnityEngine; using System.Collections; public class CachingDownloadExample : MonoBehaviour { // 번들 다운 받을 서버의 주소(필자는 임시방편으로 로컬 파일 경로 쓸 것임) public string BundleURL; // 번들의 version public int version; void Start() { StartCoroutine (DownloadAndCache()); } IEnumerator DownloadAndCache (){ // cache 폴더에 AssetBundle을 담을 것이므로 캐싱시스템이 준비 될 때까지 기다림 while (!Caching.ready) yield return null; // 에셋번들을 캐시에 있으면 로드하고, 없으면 다운로드하여 캐시폴더에 저장합니다. using(WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)){ yield return www; if (www.error != null) throw new Exception("WWW 다운로드에 에러가 생겼습니다.:" + www.error); } // using문은 File 및 Font 처럼 컴퓨터 에서 관리되는 리소스들을 쓰고 나서 쉽게 자원을 되돌려줄수 있도록 기능을 제공 } }
웹서버에 아래와 같이 저장해둔 에셋번들의 링크를 BundleURL에 넣어주도록 합시다. (서버에 올릴줄 모르시는 분은 '"file://" + 로컬 파일 경로' 을 URL에 넣어주세요.)
자 이제 Empty Object를 만들고 스크립트를 붙여 실행하면 에셋번들이 다운로드되어 캐싱되어집니다.
에셋번들 로드
이번엔 다운로드한 에셋번들을 로드하는 방법을 알아보도록 하겠습니다.
using System; using UnityEngine; using System.Collections; public class LoadAssetBundleExample : MonoBehaviour { // 번들 다운 받을 서버의 주소(필자는 임시방편으로 로컬 파일 경로 쓸 것임) public string BundleURL; // 번들의 version public int version; void Start() { StartCoroutine (LoadAssetBundle()); } IEnumerator LoadAssetBundle (){ while (!Caching.ready) yield return null; using(WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)){ yield return www; if (www.error != null) throw new Exception("WWW 다운로드에 에러가 생겼습니다.:" + www.error); AssetBundle bundle = www.assetBundle; for (int i = 0; i < 3; i++) { AssetBundleRequest request = bundle.LoadAssetAsync ("Cube " + (i + 1), typeof(GameObject)); yield return request; GameObject obj = Instantiate (request.asset) as GameObject; obj.transform.position = new Vector3 (-10.0f + (i * 10), 0.0f, 0.0f); } bundle.Unload(false); www.Dispose (); } // using문은 File 및 Font 처럼 컴퓨터 에서 관리되는 리소스들을 쓰고 나서 쉽게 자원을 되돌려줄수 있도록 기능을 제공 } }
위에서도 설명드렸듯이 LoadFromCacheOrDownload() 함수는 캐시로부터 로딩하거나, 다운로드하는 것 입니다. 이미 에셋번들은 다운로드되어 캐싱되어있으니 한번 더 이 함수를 사용하여 로드해주면 됩니다. LoadAssetSync 함수는 이름 식별자를 파라미터로 하여 오브젝트를 로드합니다. 이 이름은 프로젝트 뷰에 표시되는 이름이죠. 선택적으로 오브젝트 타입을 파라미터로 Load 메소드에 전달하여 로드된 오브젝트가 특정 타입인지 여부를 확인할 수 있습니다. 그리고 비동기로 로드함으로서 여러 에셋을 동시에 로드할 수 있습니다. 그리고 Instatiate()로 가져온 에셋을 생성해주고 위치를 지정해줍니다.
짜잔 위와 같이 에셋번들을 통해 로딩을 성공했습니다. 이전에 BuildPipeline.BuildAssetBundles 를 이용해 에셋번들을 만들었는데, 두 번째 인자를 None으로 하면 위와 같이 텍스쳐와 매터리얼을 번들에 포함하지 않아도 텍스쳐도 포함되서 가져와집니다.
에셋번들 심화 과정이 남아있습니다. 조만간 올리도록 하겠습니다.
'Frontend > Unity' 카테고리의 다른 글
유니티 프로젝트 2개 띄우기 (5) | 2016.12.16 |
---|---|
[유니티 Manual] 5.5 버전에서의 스플래시 스크린(Splash Screen) (0) | 2016.12.12 |
[유니티 에셋번들 사용법] 2. 에셋번들의 생성 및 빌드 (15) | 2016.11.25 |
[유니티 에셋번들 사용법] 1. 에셋번들이란? (2) | 2016.11.25 |
모노디벨롭에서 unsafe 모드 실행하기 (0) | 2016.11.23 |
[유니티 C# 기초 강의] 13. SendMessage와 BroadcastMessage (0) | 2016.08.05 |