Version: 2019.1
에셋 번들의 전문적인 활용
에셋 번들로 패치

에셋 번들 관리자

에셋 번들 관리자는 제외 예정이며 더 이상 에셋 스토어에서 다운로드할 수 없으나, Bitbucket repository AssetBundleDemo에서는 계속 다운로드할 수 있습니다.

에셋 번들 관리자는 Unity가 제작한 툴로 에셋 번들을 보다 효율적으로 사용할 수 있게 해줍니다.

에셋 번들 관리자 패키지를 다운로드하고 가져오는 경우 에셋 번들을 로드하고 사용할 수 있도록 하는 새로운 API 호출을 추가하게 되며, 워크플로를 정렬할 수 있도록 하는 몇 가지 에디터 기능이 추가됩니다. 새로운 기능은 에셋 메뉴 아래에 있습니다.

새롭게 추가되는 기능은 다음과 같습니다.

시뮬레이션 모드(Simulation Mode)

시뮬레이션 모드를 활성화하면 에셋 번들 관리자가 에셋 번들에 작업을 할 수 있게 됩니다. 이때 번들이 빌드되어 있을 필요는 없습니다. 에디터는 에셋 번들에서 에셋을 실제로 추출하는 것이 아니라, 해당 에셋 번들에 할당된 에셋을 파악하고 이를 직접 사용하기 때문입니다.

매번 에셋 번들을 다시 빌드하고 배치할 필요 없이 에셋을 수정, 업데이트, 추가, 삭제할 수 있는 점이 시뮬레이션 모드의 주요 장점입니다.

에셋 번들 배리언트는 시뮬레이션 모드를 사용할 수 없습니다. 만약 배리언트를 사용해야 하는 경우 로컬 에셋 번들 서버 기능을 사용합니다.

로컬 에셋 번들 서버(Local AssetBundle Server)

에셋 번들 관리자는 에디터나 로컬 빌드(모바일 포함)의 에셋 번들을 테스트할 때 사용할 수 있는 로컬 에셋 번들 서버를 시작할 수도 있습니다.

로컬 에셋 번들 서버가 작동하기 위해서는 다음과 같이 프로젝트의 루트 디렉토리에서 에셋 폴더와 동일한 수준을 가지는 에셋 번들 폴더를 생성할 수 있습니다.

폴더를 생성한 이후에는 이 폴더에 에셋 번들을 빌드해야 합니다. 새 메뉴 옵션에서 에셋 번들 빌드하기를 선택합니다. 해당 디렉토리에 에셋 번들이 빌드됩니다.

에셋 번들이 빌드되었으면(또는 시뮬레이션 모드를 사용하는 경우) 에셋 번들을 로드할 수 있습니다. 이제 에셋 번들 관리자를 통해 사용할 수 있는 새로운 API 호출에 대해서 알아보겠습니다.

AssetBundleManager.Initialize()

이 기능은 AssetBundleManifest 오브젝트를 로드합니다. 에셋 번들 관리자를 사용하여 에셋을 로드하기 이전에 이 오브젝트를 호출해야 합니다. 다음의 간단한 예제는 어떻게 에셋 번들 관리자를 초기화하는지 보여줍니다.

IEnumerator Start()

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

에셋 번들 관리자는 Initialize()가 호출되는 동안 로드된 매니페스트를 사용하여, 씬 뒤의 종속성 관리를 포함한 다양한 기능을 지원합니다.

에셋(Assets) 로드

이제 본격적으로 시작하겠습니다. 에셋 번들 관리자를 사용하고 있고, 초기화가 끝났으며, 에셋을 로드할 준비가 된 상태입니다. 다음은 어떻게 에셋 번들을 로드하고 해당 번들에서 오브젝트를 인스턴스화 하는지에 대한 예제입니다.

IEnumerator InstantiateGameObjectAsync (string assetBundleName, string assetName)

{
    // Load asset from assetBundle.
    AssetBundleLoadAssetOperation request = AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(GameObject) );
    if (request == null)
        yield break;
    yield return StartCoroutine(request);
    // Get the asset.
    GameObject prefab = request.GetAsset<GameObject> ();
    if (prefab != null)
        GameObject.Instantiate(prefab);
}

에셋 번들 관리자는 모든 로드 작업을 비동기식으로 수행하여 yield return StartCoroutine(request) 호출에 따라 번들을 로드하는 로드 작업 요청을 반환합니다. 이때 필요한 것은 GetAsset<T>()를 호출하여 에셋 번들에서 게임 오브젝트를 로드하는 것입니다.

씬(Scene) 로드

씬에 할당된 에셋 번들 이름이 있고, 그 씬을 로드해야 하는 경우 조금 다른 코드 경로를 사용해야 합니다. 경로 패턴은 거의 비슷합니다. 다음은 어떻게 에셋 번들에서 씬을 로드하는지에 대한 예제입니다.

IEnumerator InitializeLevelAsync (string levelName, bool isAdditive)

{
    // Load level from assetBundle.
    AssetBundleLoadOperation request = AssetBundleManager.LoadLevelAsync(sceneAssetBundle, levelName, isAdditive);
    if (request == null)
        yield break;
    yield return StartCoroutine(request);
}

보다시피 씬을 로드하는 것은 비동기적이며, LoadLevelAsync는 씬을 로드하기 위해서 StartCoroutine에 전달되어야 하는 로드 작업 요청을 반환합니다.

배리언트(Variants) 로드

에셋 번들 관리자를 사용하여 배리언트를 로드하는 경우, 씬이나 에셋을 로드하기 위해 필요한 코드를 변경할 필요는 없습니다. ActiveVariants를 AssetBundleManager의 프로퍼티로 설정하기만 하면 됩니다.

ActiveVariants 프로퍼티는 스트링 배열입니다. 에셋에 할당하는 동안 생성한 배리언트의 이름을 포함한 스트링 배열을 빌드하기만 하면 됩니다. 다음은 어떻게 hd 배리언트가 있는 씬 에셋 번들을 로드하는지에 대한 예제입니다.

IEnumerator InitializeLevelAsync (string levelName, bool isAdditive, string[] variants)

{
    //Set the activeVariants.
    AssetBundleManager.ActiveVariants = variants;
    // Load level from assetBundle.
    AssetBundleLoadOperation request = AssetBundleManager.LoadLevelAsync(variantSceneAssetBundle, levelName, isAdditive);
    if (request == null)
        yield break;
    yield return StartCoroutine(request);
}

다른 코드에서 (아마도 버튼 클릭 또는 다른 상황에서)구성된 스트링 배열을 전달합니다. 이 코드는 사용 가능한 액티브 배리언트와 일치하는 번들을 로드합니다.


에셋 번들의 전문적인 활용
에셋 번들로 패치