Unity3D Create And Download AssetBundle

에셋번들의 생성부터 적용과정, 간단한 관리에 대한 설명과

프로젝트에 에셋 번들을 적용하는 과정에서 생긴 이슈에 대한 글입니다.

에셋 번들의 사용 목적

대부분의 개발자들은 다음과 같은 목적으로 AssetBundle을 적용하려 할 것입니다.

  • 클라이언트 APK를 Resource와 분리시킨다. (APK 용량 감소를 통한 마켓 업로드)
  • Resources폴더의 파일을 최대한으로 줄여 메모리(RAM) 사용량을 감소시킨다.
  • 에셋 번들 버전 업데이트를 통해 APK 교체없이 Prefab, Model 데이터를 변경한다.

제작시 고려 사항

  • 에셋 번들의 데이터 및 버전은 어떻게 관리될 것인가 ?
  • Network와의 연결이 불안정할 경우 예외는 어떻게 처리할것인가 ?
  • Android, IOS 에서 파일 관리는 어떻게 이루어질 것인가 ?
  • Prefab간 상호 의존 (Dependence)에 따른 로딩 순서 및 로딩은 어떻게 이루어 질 것인가?

제작 과정

  1. 에셋 번들 생성 스크립트
  2. 에셋 번들 Export
  3. NAS 또는 HTTP 업로드 후 다운로드
  4. 더 개선할 방향 및 Dependence 관리

에셋 번들 생성 스크립트

구글에 검색시 대표적으로 나오는 코드중 한개입니다.

캡처

주의 : Project/Editor 폴더에 해당 스크립트를 생성해야 합니다. 그렇지 않을경우 에러가 발생합니다.

해당 코드를 생성, 저장 한뒤 유니티 에디터를 확인하면 다음과 같은 메뉴가 생성됩니다.Button.png

앞으로 이 버튼을 이용해서 에셋 번들을 생성하게 됩니다.

에셋 번들 Export

에셋 번들을 생성하고자 하는 프리팹을 선택한뒤 Inspector 창을 보면 다음과 같은 부분이 보입니다.

Inspector

Prefab으로 만들어져 있는 대상에서만 다음과 같이 보이게 됩니다.

밑의 AssetBundle을 보면 hawaii_couse라고 되어있습니다. 현재 이 프리팹은 추출하게 되면 hawaii_couse라는 에셋 번들로 추출됩니다. 사진과 같이 설정하기 위해서 먼저 AssetBundle 오른쪽의 hawaii_couse가 적혀있는 칸을 클릭하세요

AssetBUndle2

아직 설정이 되어있지 않다면 None으로 되어있을 것입니다. New버튼을 누른다음 자신이 원하는 이름으로 설정해 주세요 원하는 이름을 작성한뒤 엔터를 누르면 해당 이름으로 설정됩니다.

  1. 사용하지 않는 이름은 지우고 싶다면 Remove Unused Names를 클릭하면 자동으로 사용하지 않는 이름을 모두 지워줍니다.
  2. 한개의 에셋 번들에 여러 프리팹의 데이터를 담고싶다면 프리팹들의 에셋 번들 이름을 같은 이름으로 설정하면 됩니다.

설정이 끝났다면 방금 만든 메뉴버튼을 클릭, 파일로 Export 합니다. 추출된 파일은 Project 탭에서 AssetBundles 폴더에 담기게 됩니다. 추출이 끝났다면 탐색기에서 다음과 같은 파일들을 확인할 수 있습니다.

탐색기.PNG번들은 1개 생성되었지만 파일은 8개 있습니다. 여러분이 실질적으로 사용할 파일은 hawaii_couse 입니다. 다른 이름으로 지정했다면 해당 이름으로 생성된 파일입니다. manifest, manifest.meta, meta 파일은 실질적으로 사용할 일이 없으며 버전 관리가 필요할 경우 AssetBundles 파일을 이용하면 좀더 간편하게 할 수 있습니다. (에셋 번들을 생성할때 번들들에 대한 정보가 들어있습니다.)

NAS 또는 HTTP 업로드 후 다운로드

서버가 구축되어 있지 않거나 간단한 테스트를 원하는 상태라면 NAS를 연결, 이용하거나 CAFE24와 같은 호스팅센터를 이용해서 파일을 업로드 하세요. 유니티에서 에셋번들 데이터를 다운로드 하기 위해서는 URL 주소가 필요합니다. 단순히 실험만 할것이라면 file://C:\Users 와같은 경로로 설정해도 테스트는 할 수 있습니다. 이번 문단에서는 NAS 또는 HTTP에 있을때 받는 과정을 살펴보겠습니다.

현재 에셋 번들을 받을 수 있는 다양한 다운로드 방법이 있습니다. UnityWebRequest를 이용할 수도 있지만 LoadFromCacheOrDownload를 통해서도 쉽게 적용이 가능합니다. 후자의 방법을 이용해서 구현하면 다음과 같은 코드가 나오게 됩니다.

AssetBundle.PNG

Caching 준비가 되길 기다린뒤 준비가 된다면 WWW를 이용해 다운로드 하게 됩니다. url은 에셋번들을 업로드한 주소를 넣으면 됩니다. (파일에서 업로드 할 경우 file:// + 파일 경로를 입력해주면 됩니다) version을 따로 관리하지 않는다면 1을 넣어서 테스트하면 됩니다.

LoadFromCacheOrDownload는 여러분이 빌드할 기기의 스토리지에 에셋번들 파일을 저장하게 됩니다. version이 같은 파일이 이미 존재할 경우 다운로드 하지 않고 캐쉬에 있는 데이터를 사용하게 됩니다. version이 더 높을경우 해당 에셋 번들을 다운로드 합니다. (주의 : 구버전의 캐쉬 데이터를 자동으로 지워주지 않습니다.)

이제 번들을 다운로드 받았으니 인스턴스로 생성해보겠습니다.

인스턴스화bundle.LoadAsset함수를 실행한뒤 Instance로 만들 Prefab의 이름을 넣어주세요. 이때 Prefab의 이름은 Project뷰 또는 Hierarchy뷰에서 보이는 이름 그대로 작성하면 됩니다. Instantiate(bundle.LoadAsset(prefabName)) 과 같이 생성해도 되며 사진과 같이 다른 GameObject에 담아둔뒤 복제해서 사용 해도 됩니다. 주의할점은 밑의 bundle.Unload() 함수입니다.

bundle.Unload(false)를 실행하게 되면 에셋 번들 데이터는 메모리에서 해제됩니다. 하지만 현재 씬에 오브젝트가 사용되고 있다면 해당 오브젝트는 씬내에서 그대로 유지됩니다 (주의 : Unload 한뒤 bundle.LoadAsset을 다시 실행하게 되면 로드되지 않습니다. 그 이유는 이미 Unload했기 때문입니다. 만약 다시 생성을 원한다면 AssetBundle을 이전과 같이 로딩하거나 어느곳에서 참조를 가지고 있어야합니다.)

bundle.Unload(true)를 실행하게 되면 에셋 번들 데이터 뿐만이 아니라 현재 생성된 Instance 들도 모두 null로 전환됩니다. 일반적인 상황에서는 bundle.Unload(false)를 많이 사용합니다.

이러한 방법을 통해서 에셋 번들을 통해 인스턴스를 간단하게 생성해 봤습니다.

더 개선할 방향 및 의존성(Dependence) 관리

에셋 번들은 만드는 것보다는 관리되어지는게 더 중요합니다. AssetBundle Using Pattern 이라고 검색하면 다양한 문서들을 참고할 수 있습니다. 이 문단에서는 간단하게 소개하겠습니다.

에셋 번들을 어떠한 기준으로 쪼갤것인가 ?

에셋 번들 안에 들어있는 프리팹 한개가 변경된다면 여러분은 해당 파일을 업데이트 해줘야 할것입니다. 대체적으로 에셋번들은 두가지 방법으로 나뉩니다. 1. 적은 용량으로 여러개의 에셋 번들을 구성 2. 큰 용량으로 적은 개수의 에셋 번들을 구성

주의할점은 에셋번들을 관리하는 것 뿐만이 아니라 에셋 번들을 Unity에서 로드할때 파일 입출력으로 인한 오버헤드가 발생된다는 점입니다. 실질적으로 로드할 데이터는 적지만 파일이 여러개 나뉘어져 있다면 파일 입출력에 더 많은 시간을 사용 -> 로딩시간 증가로 이어질 것입니다. 반대로 큰 파일로 구성되어 있다면 업데이트마다 다운로드에 많은 시간이 소요될것입니다.

“나무”라는 프리팹을 A가 사용하고 B도 사용하는 상황에서 에셋번들로 각각 추출하면 어떻게 될까요 ? A에도 나무의 데이터가 담기고 B도 나무의 데이터가 담기게 됩니다. 이렇게 상호 의존하는 상황이 생겼을때는 어떻게 해야할까요 ? 에셋번들이 다른 에셋번들을 참조해야 하는 상황일 수도 있습니다. 하지만 유니티에서는 자체적으로 이러한 의존성(Dependence)에 맞춰 순서를 변경, 로드 해주지는 않습니다. 이는 전적으로 개발자가 Custom Loader를 만들어서 해결해야 합니다.

에셋 번들 브라우저.PNG현재 유니티 스토어에 있는 번들 브라우저를 이용하는 것도 좋은 방법일 수 있습니다. 트리구조로 상호 의존 관계를 명확하게 한뒤 중복되는 요소를 최대한 줄여 에셋번들 용량 증가를 방지할 수도 있습니다. 해당 에셋은 5.6이상에서 사용되며 다양한 툴들이 많이 나와있고 Unity에서도 해당 부분을 인지하고 좀더 편하게 개선되는 과정이니 기다리면 더 좋아질 수 있습니다.

지금까지 단순한 방법으로 에셋 번들을 생성, 인스턴스화 해봤습니다. 더 발전한다면 적은 에셋번들의 개수로 용량 증가 없이 효율적으로 관리가 가능해질 것입니다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중