유니티 에셋 번들이란?

유니티 에셋 번들은 유니티 게임 프로젝트를 구축하고 실행하는 데 필요한 원본 파일 및 에셋 모음입니다. 원하는 경우 스크립트, 3D 모델, 텍스처, 오디오, 또는 씬(Scene)을 에셋 번들 안에 포함시킬 수 있습니다.

유니티 에셋 번들의 사용 목적

유니티 에셋 번들은 게임 프로젝트의 기본 파일 크기를 줄이고 관련된 모든 게임 에셋들을 보다 쉽게 관리하기 위한 목적에서 사용합니다. 

또한 에셋 번들을 사용하면 런타임(게임이 실행되고 있는 동안) 도중, 필요한 컨텐츠를 필요한 순간에 비동기식으로 스트리밍하고 로드(load)할 수 있습니다.

유니티 에셋 번들은 에셋 관리를 편하게 해 준다

이것은 플레이어가 게임을 불러 들일 때 필요한 데이터를 처음부터 메모리에 전체적으로 다 로드하지 않고도 게임을 시작할 수 있다는 것을 의미합니다. 따라서 게임 플레이어의 플레이 경험을 향상시킬 수 있고, 초기 로딩에 필요한 파일 사이즈를 줄일 수 있습니다.

에셋 번들의 사용 이점

유니티 에셋 번들을 사용하면 다음과 같은 몇 가지 이점이 있습니다.

예를 들어, 여러 에셋들을 개별적으로 저장하는 대신 하나의 파일에 저장할 수 있습니다. 결과적으로 필요한 파일 수가 줄어들기 때문에 에셋을 이용한 작업을 할 경우 필요한 것을 찾기가 쉽습니다.

또한 수 많은 개별 파일들 대신 에셋 번들을 사용함으로써 여러 분야의 작업자들 (그래픽 아티스트, 레벨 디자이너, 프로그래머) 이 서로의 업무를 방해하지 않고 효과적으로 일할 수 있습니다. 즉, 공통 폴더 구조를 공유하지 않더라도 필요한 파일에 액세스할 수 있기 때문입니다. 

에셋 번들 구현 방법

에셋 번들을 유니티 C# 스크립트로 구현하려면 다음과 같이 하시면 됩니다.

using UnityEngine;
using UnityEditor;

public class AssetBundleExample : MonoBehaviour
{
    [MenuItem("MyMenu/Build AssetBundle")]
    static void BuildAssetBundle()
    {
        // 번들에 포함할 에셋을 선택
        Object[] assets = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

        // 번들 이름과 에셋을 지정
        AssetBundleBuild build = new AssetBundleBuild
        {
            assetBundleName = "my-asset-bundle",
            assetNames = assets.Select(a => AssetDatabase.GetAssetPath(a)).ToArray()
        };

        // 에셋 번들 빌드
        BuildPipeline.BuildAssetBundles("Assets/AssetBundles", new AssetBundleBuild[] { build });
    }
}

위의 코드에서 눈여겨 볼 부분들은 다음과 같습니다.

[MenuItem("MyMenu/Build AssetBundle")]

이 행은 MenuItem 속성(attribute)을 사용하여 Unity 에디터의 기본 메뉴에 새 항목을 추가합니다. 새 메뉴 항목은 “Build AssetBundle”라는 이름으로 지정되고 “MyMenu” 메뉴 아래에 위치합니다.

Object[] assets = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

이 행은 Selection.GetFiltered() 함수를 사용하여 Unity 에디터에서 현재 선택된 객체의 배열을 가져옵니다. typeof(Object) 인자는 모든 유형의 객체가 포함되어야 함을 나타내고 SelectionMode.DeepAssets 인자는 하위 폴더를 포함하여 프로젝트의 모든 에셋이 선택 항목에 포함되어야 함을 지정합니다.

AssetBundleBuild build = new AssetBundleBuild
{
    assetBundleName = "my-asset-bundle",
    assetNames = assets.Select(a => AssetDatabase.GetAssetPath(a)).ToArray()
};

이 부분은 새 AssetBundleBuild 개체를 만들고 해당하는 assetBundleName 및 assetNames 속성을 설정합니다.

assetBundleName 속성은 AssetBundle의 이름을 지정하고 assetNames 속성은 번들에 포함할 자산의 이름을 지정합니다.

assets.Select() 및 ToArray() 함수는 자산 배열을 자산 이름 배열로 변환하는 데 사용됩니다.

BuildPipeline.BuildAssetBundles("Assets/AssetBundles", new AssetBundleBuild[] { build });

이 행은 BuildPipeline.BuildAssetBundles() 함수를 사용하여 에셋 번들을 빌드합니다.

첫 번째 인수는 에셋 번들의 출력 디렉터리를 지정하고 두 번째 인수는 이전 줄에서 생성된 빌드 개체를 포함하는 AssetBundleBuild 개체의 배열입니다.

참고 페이지

유니티 에셋 번들이 무엇이고 어떤 목적으로 사용되는지에 대해서 이해하기는 쉬워도 실제로 그것을 사용하는 방법을 익혀 활용하기 위해서는 좀 더 상세한 자료를 통해 공부하셔야 합니다.

유니티 공식 매뉴얼 페이지의 에셋 번들 항목을 방문하셔서 더 자세한 내용을 배워 보시기 바랍니다. 에셋 번들 사용시의 시행착오를 줄이실 수 있을 것입니다.

더 공부할 자료

유니티 C# 스크립트 작성에 대해 보다 심도 있는 공부를 원하시면 다음 링크를 체크해 보시기 바랍니다.

유니티 C# 프로그래밍 연습 (ebook)

“막 유니티를 배운 주니어 게임 프로그래머로서 자신의 힘으로 첫번 째 게임을 만들고 싶지만 어디서부터 시작해야 할지 막막한 분 계신가요? 이 책을 읽어 보세요. 간단한 게임이지만 게임 구현 전체 프로세스를 자세한 설명과 함께 제공합니다. 동영상 예제까지 들어 있어요!”

더 공부할 자료 - 개발 능력 다양화를 위한 학습의 필요성

유니티 엔진의 대안으로서, 인디 개발자들에게 선풍적인 인기를 끌고 있는 엔진이 바로 고도 엔진입니다. 혹시 고도 엔진을 배워 보려고 하신다면, 다음의 온라인 강의를 체크해 보시기 바랍니다.

초보자를 위한 고도엔진 게임 개발 입문