본문 바로가기

TOOL/Unity

Asset Bundle Manager

Asset Bundle Manager


이름 그대로 asset bundle을 효율적으로 사용할 수 있도록 만들기 위해 제작된 도구이다.


Asset bundle Manager Package를 download하고 import하면 새로운 API호출이 추가될 뿐만 아니라 일부 Editor 기능이 추가되어 작업과정을

간소화 시켜준다. 이 기능은 Asset menu option에서 찾을 수있다.


Assetbundles에는 다음과 같은 Option이 있다.



Simulation Mode


Simulation Mode를 활성화 하면 실제로 asset bundle을 build하지 않은 상태에서도 asset bundle manager가 asset bundle과 함께 작동할 수 있게 된다.

Editor는 asset bundle에서 등록된 asset을 확인하고 실제 asset bundle에서 asset을 가져오는 대신 asset을 직접 사용한다.


Simulation Mode를 사용함으로서 얻을 수 있는 가장 중요한 이점은 매번 Asset bundle을 다시 build하고 배포할 필요없이 asset을 modified, update, add and remove를 할 수 있다는 점이다.


Asset bundle variants 는 simulation mode에서 작동하지 않는다. 

Variant를 사용해야 하는 경우에는 loacl asset bundle server가 필요하다.




Local Asset Bundle Sesrver


Asset bundle manager는 editor나 loacl build(include mobile)에서 asset bundle을 test하는데 사용할 수 있는 asset bundle server를 시작할 수도 있다.


Local asset bundle server를 작동시키기 위해서 지켜야할 점은 다음과 같이 Assets 폴더와 같은 position의 project root directory에 AssetBundle라는 Folder를 만들어야 한다는 것이다.



Folder를 생성한 이후에 새로 만들어진 menu option에서 Build AssetBundles를 선택하면 Asset bundle이 해당 directory에 build된다.


이제 asset bundle build(or simulation mode를 사용하기로 결정)했고 asset bundle을 load할 준비가 되었으니 

Asset bundle manager를 통해 사용할 수 있는 새로운 API호출을 살펴보자.




AssetBundleManager.Initialize()


이 함수는 AssetBundleManifest객체를 불러온다. 

AssetBundleManager를 사용해서 asset에서 load하기 전에 이 함수를 호출해야 한다.

이것은 아주 간단한 예제이며 AssetBundleManager를 초기화하는 방법은 다음과 같다.



    
    IEnumerator start()
    {
        yield return StartCoroutine(Initialize()); //Manager Initialize
    }
    IEnumerator Initialize()
    {
        var request = AssetBundleManager.Initialize();
        if(request != null)
        {
            yield return StartCoroutine(request);
        }
    }

AsssetBundle Manager는 Initialize()중에 load하는 이 Manifest를 사용하여 dependency 관리를 비롯한 다양한 기능을 지원한다.




Loading Assets


Scene에서 할당된 asset bundle name이 있는 scene을 load해야하는 경우 약간 다른 code 경로를 따라야 한다.

비슷하지만 약간의 차이가 있다.

Asset bundle에서 scene을 load하는 방법은 다음과 같다.



    
    IEnumerator InitializeLevelAsync(string levelName, bool isAdditive)
    {
        AssetbundleLoadOperation request = AssetBundleBundleManager.LoadLevelAsync(sceneAssetBundle, levelName, isAdditive);

        if (request == null)
            yield break;
        yield return StartCoroutine(request);
    }


보다싶이 Scene load는 Async(비동기)이며 LoadLevelAsync는 Scene을 불러오기 위해 StartCoroutine으로 전달되어야 하는

Load 조장 요청을 반환한다.




Loading Variants


AssetBundle Manager를 사용하여 Variants를 load해도 Scene이나 Asset에서 불러와야 하는 code는 실제로 변경되지 않는다.

모든 작업을 수행하려면 assetbundle manager의 ActiveVariants 속성을 설정해야 한다.


ActiveVariants속성은 string array이다. Asset에 할당하는 동안 생성된 variants의 이름을 포함하는 string array를 작성하기만 하면 된다.

다음은 HD Variants로 Scene asset bundle을 불러오는 방법에 대한 예제이다.



    
    IEnumerator InitializeLevelAsync(string levelName, bool isAdditive, string[] variants)
    {
        AssetBundleManager.ActiveVariant = variants; //active Variants를 설정

        AssetBundleLoadOperation request = AssetbundleManager.LoadLevelAsync(variantSceneAssetBundle
        , levelName, isAdditive); //Asset bundle로 부터 Scene load

        if(request == null)
        {
            yield break;
        }
        yield return StartCoroutine(request);
    }


string array를 전달한 곳은 코드의 다른 부분이다.(아마도 버튼클릭이나 다른 이벤트)

이것으로 active variants와 일치하는 asset bundle을 load하게 될것이다.





'TOOL > Unity' 카테고리의 다른 글

Mono / Mono Behaviour  (0) 2019.03.05
IL2CPP / GCC / C# C++ Assembly 변환과정  (0) 2019.03.05
Asset bundle 사용법  (0) 2019.02.27
대표적인 Memory leak 발생 유형  (0) 2019.02.26
Asset Bundle  (0) 2019.02.26