본문 바로가기

Unity

에셋번들 생성하기 & 다운로드

에셋번들을 만들기 위해서는 먼저 에셋번들로 만들 리소스를 분류해야한다.

프로젝트 뷰에서 리소스를 클릭하면 아래와 같은 뷰를 볼 수 있는데

이 뷰의 하단에 AssetBundle의 리스트 박스가 있다.

디폴트는 None 으로 되어있는데 New를 사용하여 새로운 에셋번들 이름을 정할 수 있다.

에셋번들로 사용할 리소스의 에셋번들 이름을 설정해 준다.




헌데 에셋번들 이름만 설정하는 것으로는 에셋번들이 자동적으로 생성되지 않는다.

때문에 직접 코드를 작성해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
using UnityEditor;
 
public class AssetBundleBuilder : Editor 
{
    [MenuItem("Assets/BuildBundle")]
    static void BuildBundle()
    {
        BuildPipeline.BuildAssetBundles("AssetBundles");
    }
}
 
cs

MenuItem을 사용하여 유니티의 Asset탭에 BuildBundle탭이 나타나게 하였다.

BuildPipeline을 이용하여 에셋번들의 이름이 지정된 리소스를 에셋번들로 만들어준다.

BuildAssetBundles는 에셋번들을 만들어주는 함수로 매개변수에는 에셋번들이 저장될 경로를 넣어주었다.


Asset탭에 BuildBundle탭이 생겼다.


사용해보면 에셋번들이 생성된다.




요롷게 지정해줬던 폴더에 Bundle 파일이 생성되었다.

(아, 폴더가 미리 만들어져있지 않으면 에러를 뱉어냅니다. 폴더의 경로는 프로젝트 폴더 기준)



이제 이 에셋번들을 다운로드 할겁니다.

인터넷에 올려서 다운로드 할 수도 있지만 저는 로컬에서 받는 방식으로 해볼 것입니다.

저의 로컬 디렉터리 URL은 file:///C:/Users/UnderCode/Desktop/1.UnityTest/AssetBundleTest/bundle  입니다.

이 경로를 통해 bundle 파일을 받게 됩니다.


에셋번들을 다운로드 받는 방법은 크게 두가지가 있습니다.

WWW 클래스를 이용해서 그냥 다운 받거나

WWW.LoadFromCacheOrDownload() 함수를 이용하여 받는 방법입니다.

LoadFromCacheOrDownload() 함수는 에셋번들을 인터넷으로 부터 캐싱하여 받는 방식으로 cache 폴더에 저장됩니다.

다음에 다시 다운받을 때 하드디스크에 에셋번들이 있으면 하드디스크에 있는 에셋번들을 사용하고 없으면

 다운로드 받아서 사용합니다.



먼저 WWW를 이용하여 다운 받는 방법 

(string bundleURL = "file:///C:/Users/UnderCode/Desktop/1.UnityTest/AssetBundleTest/bundle";)

(AssetBundle bundle;)

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
    //방법 1
    IEnumerator AssetBundleLoad()
    {
        WWW www = new WWW(bundleURL);
 
        yield return www;
 
        bundle = www.assetBundle;
 
        AssetBundleRequest abr = bundle.LoadAssetAsync<Sprite>("TestImage");
        yield return abr;
        assetImage.sprite = (Sprite)abr.asset;
 
        abr = bundle.LoadAssetAsync<TextAsset>("AssetBundleTest");
        yield return abr;
        TextAsset textAsset = (TextAsset)abr.asset;
        assetText.text = textAsset.text;
 
        abr = bundle.LoadAssetAsync<AudioClip>("MazeMusic");
        yield return abr;
        assetAudio.clip = (AudioClip)abr.asset;
        assetAudio.Play();
 
        bundle.Unload(false);
    }
cs



LoadCacheOrDownload() 함수를 이용하는 방법

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
    //방법 2
    IEnumerator AssetBundleLoad()
    {
        while (!Caching.ready)
            yield return null;
 
        WWW www = WWW.LoadFromCacheOrDownload(bundleURL, bundleVer);
 
        yield return www;
 
        bundle = www.assetBundle;
 
        AssetBundleRequest abr = bundle.LoadAssetAsync<Sprite>("TestImage");
        yield return abr;
        assetImage.sprite = (Sprite)abr.asset;
 
        abr = bundle.LoadAssetAsync<TextAsset>("AssetBundleTest");
        yield return abr;
        TextAsset textAsset = (TextAsset)abr.asset;
        assetText.text = textAsset.text;
 
        abr = bundle.LoadAssetAsync<AudioClip>("MazeMusic");
        yield return abr;
        assetAudio.clip = (AudioClip)abr.asset;
        assetAudio.Play();
 
        bundle.Unload(false);
    }
cs



에셋번들에서 리소를 가져올 때는 리소스의 이름을 사용하여 리소스를 찾고(확장자는 필요 없음)

AssetBundleRequest를 이용하여 받습니다.