프로젝트의 필요 리소스나 스크립트를 에셋번들을 통해서 업데이트받고 스트리밍 다운로드 받는다는 것을
알고는 있었으나 내부적으로 어떻게 돌아가는지는 잘 모르고 있었다.
오늘을 기회로 알아보자.
참고 : https://docs.unity3d.com/kr/current/Manual/AssetBundlesIntro.html
에셋번들(AssetBundles)이란?
플레이어가 필요로 할 때 응용 프로그램에 콘텐츠를 다운로드/업데이트 하는 것을 단순화 할 수 있습니다.
에셋 번들에서 작업할 때의 일반적인 워크 플로우는 다음과 같습니다. ( 개발시 개발자는 에셋 번들을 준비하고 서버에 업로드 )
1. 에셋 번들 만들기
2. 외부 스토리지에 에셋 번들을 로드하기
런타임 사용자의 컴퓨터에서 응용 프로그램은 에셋 번들을 필요할 때 로드하고 각 에셋 번들에서 개별 에셋도 필요에 따라 처리합니다.
1. 어플리케이션 런타임 중 에셋 번들을 다운로드
2. 에셋 번들로부터 개체 로드
에셋 번들 빌드 (소스 출저 : http://itmining.tistory.com/55 )▼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | using UnityEngine; using UnityEditor; public class BuildAsssetBundles : MonoBehaviour { /*********************************************************************** * 용도 : MenuItem을 사용하면 메뉴창에 새로운 메뉴를 추가할 수 있습니다. * (아래의 코드에서는 Bundles 항목에 하위 항목으로 Build AssetBundles 항목을 추가.) ***********************************************************************/ [MenuItem("Bundles/Build AssetBundles")] static void BuildAllAssetBundles() { /*********************************************************************** * 이름 : BuildPipeLine.BuildAssetBundles() * 용도 : BuildPipeLine 클래스의 함수 BuildAssetBundles()는 에셋번들을 만들어줍니다. * 매개변수에는 String 값을 넘기게 되며, 빌드된 에셋 번들을 저장할 경로입니다. * 예를 들어 Assets 하위 폴더에 저장하려면 "Assets/AssetBundles"로 입력해야합니다. ***********************************************************************/ BuildPipeline.BuildAssetBundles ("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.StandaloneOSXUniversal); } } |
에셋 번들 다운로드에는 캐싱, 논캐싱의 2가지 방법이 존재.
1. 캐싱 : 새로운 업데이트를 제공하거나, DLC를 추가할 때 실행파일과 에셋 번들을 조합해 사용합니다.
한 번 다운로드 받은 파일은 하드디스크에 저장(캐싱)하고, 두번째 부터는 네트워크가 아닌 하드디스켕서 바로 로드하는 것입니다.
(사진 출저 - http://itmining.tistory.com/55 )
[WWW.LoadFromCacheOrDownload] -> ScriptRef : WWW.LoadFromCacheOrDownload.html 을 호출합니다.
에셋 번들은 로컬 저장 장치 Unity의 Cache 폴더에 캐시 됩니다.
2. 논캐싱 : 새 WWW object -> ScriptRef : WWW.WWW.html 을 만드는 것으로 할 수있습니다.
에셋 번들은 로컬 저장 장치 Unity의 Cache 폴더에 캐시 되지 않습니다.
캐싱 방법의 다운로드 코드 (소스 출저 : http://itmining.tistory.com/55 ) ▼
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 | 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; // 에셋번들을 캐시에 있으면 로드하고, 없으면 다운로드하여 캐시폴더에 저장합니다. yield return www; } // using문은 File 및 Font 처럼 컴퓨터 에서 관리되는 리소스들을 쓰고 나서 쉽게 자원을 되돌려줄수 있도록 기능을 제공 } } | cs |
에셋 번들의 로드 (소스 출저 : http://itmining.tistory.com/55 ) ▼
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 | 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; yield return www; 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 처럼 컴퓨터 에서 관리되는 리소스들을 쓰고 나서 쉽게 자원을 되돌려줄수 있도록 기능을 제공 } } |
아직 부족하다 추후 추가로 더 공부하자.
'NOTE > Unity' 카테고리의 다른 글
[Unity] 그래픽 최적화 관련 (0) | 2018.04.01 |
---|---|
[Unity] Time class 간단 정리 (0) | 2018.04.01 |
[Unity] Managed Plugins 동적 링크 라이브러리(DLL) (0) | 2017.03.31 |
[Unity] 유니티 프로그래머가 알아야할 최적화 코드 작성법 (펌) (0) | 2017.03.31 |
[Unity] MeshRenderer Material 스크립트로 변환 (4) | 2017.02.13 |