Unity/3D

에셋번들 빌드

공부하기 좋은 날 2022. 11. 16. 15:32

에셋번들은 플랫폼  별 비코드 에셋이 들어있는 아카이브 파일

 

런타임 시점에 로드할 수 있다.


에셋번들 = 에셋의 묶음, 런타임에 리소스를 다운받을 수 있게 하는 것
에셋 번들 사용 이유:1) 용량을 줄이기 위해 2) 업데이트 쉽게 하기 위해(패치만 받으면 됨)

에셋번들 사용법
1. 에셋번들 빌드

 

프로젝트 내 프리펩에서 에셋번들 이름을 지정해준다. New를 눌러서 입력. 경로를 추가하려면 / 를 사이사이에 입력하면 됨

 

using UnityEditor;
using System.IO;   // 빌드이기 때문에 시스템적 기능

public class CreateAssetBundles   // Monobehavior를 상속하지 않음
{
    [MenuItem("AssetBundle/Build AssetBundles")]   // 상단바 메뉴 커스텀
    static void BuildAllAssetBundles()
    {
        string assetBundleDirectory = "Assets/AssetBundles";   // 빌드 경로
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);   // 경로가 없으면 만들어 줌
        }
        BuildPipeline.BuildAssetBundles(assetBundleDirectory,
                                        BuildAssetBundleOptions.None,
                                        BuildTarget.StandaloneWindows);   // 경로, 옵션(압축을 어떤식으로 할지), 타겟플랫폼

        EditorUtility.DisplayDialog("에셋번들 빌드", "에셋 번들 빌드를 완료했습니다", "완료");   // 에셋번들 빌드하면 나타나는 팝업창
    }
}

 

상단바에 나타난 버튼을 눌러 에셋번들을 빌드한다.
설정한 경로에 지정한 프리펩과 재질이 저장된 것을 확인할 수 있다.

**주의할 점: 머테리얼은 에셋번들 빌드에 포함하지 않을 것. 머테리얼은 프리펩에 종속되어있기 때문에 머테리얼을 따로 에셋번들로 넣으면 프리펩을 로드했을 때 재질이 깨져서 보임.

 

 

2. 에셋번들 로드 및 사용

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class LoadObjFromAssetBundle : MonoBehaviour
{
    void Start()
    {
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, "AssetBundles/obj/blue"));   // 파일 경로 정확히 넣어야 함.
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("TestOBJ");   // 에셋 번들에서 사용한 이름이 아닌, 프리펩으로 저장된 이름을 작성해야 함
        Instantiate(prefab);
        
    }
}

플레이 시작시 해당 오브젝트가 나타난다.



3. 에셋번들 Un로드

 

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class LoadObjFromAssetBundle : MonoBehaviour
{
    IEnumerator Start()
    {
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, "AssetBundles/obj/blue"));   // 파일 경로 정확히 넣어야 함.
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }
        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("TestOBJ");   // 에셋 번들에서 사용한 이름이 아닌, 프리펩으로 저장된 이름을 작성해야 함
        var cube = Instantiate(prefab);
        cube.transform.position = Vector3.zero;

        yield return new WaitUntil(() => Input.GetMouseButtonDown(0));
        myLoadedAssetBundle.Unload(true);   // 에셋번들 언로드
        Destroy(cube);
    }

   
}

언로드를 통해 할당 받은 에셋번들을 삭제해준다.