본문 바로가기
NOTE/Unity

[Unity] Asset Bundle

by DevAthena 2018. 4. 1.

프로젝트의 필요 리소스나 스크립트를 에셋번들을 통해서 업데이트받고 스트리밍 다운로드 받는다는 것을

알고는 있었으나 내부적으로 어떻게 돌아가는지는 잘 모르고 있었다.

오늘을 기회로 알아보자.


참고 : https://docs.unity3d.com/kr/current/Manual/AssetBundlesIntro.html

http://itmining.tistory.com/



에셋번들(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);
    }
}
 

cs



에셋 번들 다운로드에는 캐싱, 논캐싱의 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;
        // 에셋번들을 캐시에 있으면 로드하고, 없으면 다운로드하여 캐시폴더에 저장합니다.
        using(WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)){
            yield return www;
            if (www.error != null)
                throw new Exception("WWW 다운로드에 에러가 생겼습니다.:" + www.error);
         
        } // 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;
        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 처럼 컴퓨터 에서 관리되는 리소스들을 쓰고 나서 쉽게 자원을 되돌려줄수 있도록 기능을 제공
    }
}
 

cs


아직 부족하다 추후 추가로 더 공부하자.