Asset Bundles 소개
Tutorial
·
intermediate
·
+10XP
·
60 mins
·
Unity Technologies

에셋 번들(AssetBundle)은 메인 게임이 애플리케이션과 별도로 저장되고 런타임에 로드(또는 모바일 및 온라인 앱의 경우 다운로드)되는 콘텐츠입니다. 이를 통해 고객은 필요한 부품만 다운로드하여 설치할 수 있으므로 네트워크 및 시스템 리소스에 미치는 영향을 최소화할 수 있습니다. 에셋 번들은 릴리스 후 콘텐츠를 업데이트하거나 추가하는 데에도 사용할 수 있습니다. 이 튜토리얼에서는 에셋 번들과 에셋 번들이 프로젝트에 가장 적합한 방법을 살펴봅니다.
Languages available:
1. 소개
Unity 2019.3 이상을 사용하는 경우 여기를 클릭하세요.
에셋 번들(AssetBundle)은 메인 게임이 애플리케이션과 별도로 저장되고 런타임에 로드(또는 모바일 및 온라인 앱의 경우 다운로드)되는 콘텐츠입니다. 이를 통해 고객은 필요한 부품만 다운로드하여 설치할 수 있으므로 네트워크 및 시스템 리소스에 미치는 영향을 최소화할 수 있습니다. 예를 들어, 고객이 차량을 "시승"할 수 있는 VR 앱을 보유한 자동차 제조업체는 앱에 모든 차량을 포함하고 싶지 않을 것입니다. Asset Bundle을 사용하면 고객이 시승하려는 차량과 플랫폼이 처리할 수 있는 품질 수준만 다운로드할 수 있습니다.
2. 에셋 번들의 장점
에셋 번들은 릴리스 후 콘텐츠를 업데이트하거나 추가하는 데에도 사용할 수 있습니다. 다운로드 가능한 콘텐츠, 기간 한정 프로모션 이벤트나 휴일 관련 모델과 같은 테마 콘텐츠가 포함될 수 있습니다. 또한 에셋 번들을 사용하면 자동 업데이트와 프로젝트 간에 콘텐츠를 재사용할 수 있습니다. 예를 들어 연결된 앱의 경우 로고나 소개 동영상과 같은 브랜딩을 온라인 에셋 번들로 저장할 수 있습니다. 브랜딩이 변경되면 서버에서 관련 에셋 번들만 업데이트하면 됩니다. 리모트 AssetBundle을 통해 이러한 에셋을 로드하는 앱은 업데이트가 필요 없이 업데이트된 콘텐츠를 자동으로 표시합니다. 이러한 그래픽을 다운로드하는 앱은 온라인 에셋 번들의 변경 사항을 확인하고 필요에 따라 로컬에 저장된 번들을 업데이트하도록 사전 프로그래밍할 수 있습니다.
3. 배리언트
에셋 번들은 배리언트로 더 나눌 수 있습니다. 배리언트는 함께 저장된 에셋 번들의 옵션 또는 서브클래스입니다. Vehicles라는 에셋 번들이 있는 경우 자동차용 배리언트와 트럭용 배리언트가 있을 수 있습니다. 번들 에셋을 변형에 할당하는 경우 해당 번들의 모든 에셋을 변형에 할당해야 합니다. bundlename.variant에 자산을 포함하고 bundlename(변형 없음)에 다른 에셋을 가질 수 없으며, 여기서 bundlename은 둘 다 동일합니다.
에셋 번들 구성을 지원하기 위한 배리언트의 한 가지 용도를 설명하기 위해, 멀티 콘솔 비디오 게임을 위한 튜토리얼 레벨을 만들고 있다고 가정해 보겠습니다. 다음 표에는 플레이어에게 누를 버튼을 보여주기 위해 지침에서 사용할 수 있는 몇 가지 그래픽이 나열되어 있습니다. 컨트롤러 레이아웃은 최신 콘솔에 일반적이지만 액션 버튼의 레이블은 플랫폼에 따라 다릅니다. 이 예제에서 상단 작업 버튼은 레이블이 다르더라도 게임의 두 버전에서 동일한 작업을 수행합니다. 코드에서는 방향성 그래픽을 위해 Universal Variant를 로드하지만 런타임에 특정 시스템의 버튼 또는 키보드 그래픽을 포함하는 변형을 로드합니다.
Asset Bundle ControlImages의 내용

크로스 플랫폼 데스크톱 응용 프로그램에서 사용자를 교육하는 데 사용할 키 이미지를 번들로 묶는다고 가정해 보겠습니다. ConsoleA와 ConsoleB는 각각 Windows와 macOS가 될 수 있으며 TopActionButton은 CmdCtrl과 비슷할 수 있습니다.
4. 에셋 번들 생성
현재 에셋 번들을 빌드하는 유일한 방법은 스크립팅을 통하는 것입니다. 다음 스크립트는 이 기능을 Unity 에디터에 추가합니다. BuildAssetBundles에는 에셋 번들이 생성되어야 하는 디렉터리, 비표준 빌드 모드용 BuildAssetBundleOption(선택 사항), 에셋 번들의 빌드 타겟 등 세 가지 파라미터가 있습니다.
- 라는 폴더를 만듭니다. 에디터 Assets 폴더 안에 있습니다.
- 에디터 내에서 라는 새 C# 스크립트를 만듭니다. CreateAssetBundles (에셋 번들 생성).
- CreateAssetBundles를 더블 클릭하여 Visual Studio에서 열고 모든 콘텐츠를 삭제합니다.
- 다음을 입력합니다.
using UnityEditor;
using System.IO;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/StreamingAssets";
if(! Directory.Exists(Application.streamingAssetsPath))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);
}
}
- CreateAssetBundles가 완료되었습니다. 변경 내용을 저장하고 Visual Studio를 닫습니다.
- Unity 에디터의 에셋 드롭다운 하단에 새로운 옵션이 있습니다. 에셋 번들을 빌드합니다.
5. CreateAssetBundles 파라미터
지정된 AssetBundle 디렉터리는 AssetBundle이 빌드되기 전에 존재해야 합니다. BuildAssetBundleOptions 파라미터는 선택 사항이며, 아무것도 지정되지 않은 경우 기본값은 None입니다. 몇 가지 주요 옵션은 다음과 같습니다.

6. 타겟 플랫폼 옵션
에셋 번들의 필수 형식과 처리는 플랫폼에 따라 다르기 때문에 다음 옵션 중 하나를 사용하여 대상 플랫폼을 지정해야 합니다.

7. 간단한 에셋 번들 만들기
에셋 번들 로드를 테스트하기 위해 단일 GameObject로 AssetBundle을 생성합니다. 이 워크플로는 이전에 CreateAssetBundles 스크립트를 완료했다고 가정합니다. 프로젝트의 폴더 구조에서 에셋 번들 조직을 미러링하면 필요에 따라 번들 에셋을 더 쉽게 찾고 업데이트할 수 있습니다.
- 스프라이트를 Assets 폴더로 드래그합니다.
- 새 씬에서 GameObject를 만듭니다. BundledSpriteObject (번들드 스프라이트).
- Sprite Renderer 컴포넌트를 연결하고 1단계의 스프라이트를 할당합니다.
- 라는 폴더를 만듭니다. BundledAssets 에셋 내부.
- BundledAssets 안에 라는 폴더를 만듭니다. testbundle.
- BundledSpriteObject를 testbundle로 드래그하고 계층 구조에서 삭제합니다.
- 프로젝트 뷰에서 BundledSpriteObject를 클릭하여 인스펙터를 엽니다. 인스펙터의 하단 부분에 특히 주의하십시오.
- AssetBundle 옆의 None을 클릭하여 BundledSpriteObject를 에셋 번들에 할당합니다. (그림 01)

- 새로 만들기(그림 02), type testbundle을 클릭하고 [Enter]를 누릅니다.

- Assets(에셋) 드롭다운에서 Build AssetBundles(에셋 번들 빌드)를 선택합니다.
- 배리언트에 에셋을 할당하려면 1-9단계를 따르되 하단 중앙이 아닌 오른쪽 하단 모서리에 있는 없음을 클릭합니다.
8. 로컬에 저장된 에셋 번들 로드하기
오류가 발생하지 않았다고 가정하면 로컬 저장소에서 AssetBundle을 로드할 준비가 된 것입니다. 데모를 쉽게 하기 위해 Start에서 번들을 로드하고 있습니다. 프로덕션에서는 필요한 경우에만 AssetBundle을 로드합니다.
- X 및 Y에서 메인 카메라의 변환 위치를 0으로 설정합니다.
- 라는 새 GameObject를 만듭니다. Loader.
- 라는 새 C# 스크립트를 만듭니다. BundledObjectLoader Loader에 연결합니다.
- 두 번 클릭 BundledObjectLoader 을 클릭하여 Visual Studio에서 엽니다.
- Update 메서드를 삭제합니다.
- 4번째 줄에 다음을 입력합니다.
using System.IO;- 7줄부터 다음과 같이 입력합니다.
public string assetName = "BundledSpriteObject";
public string bundleName = "testbundle";- 시작에서 12줄부터 시작하여 다음을 입력합니다.
AssetBundle localAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, bundleName));
if (localAssetBundle == null) {
Debug.LogError("Failed to load AssetBundle!");
return;
}
GameObject asset = localAssetBundle.LoadAsset<GameObject>(assetName);
Instantiate(asset);
localAssetBundle.Unload(false);- 변경 사항을 저장하고 Unity 에디터로 돌아갑니다.
- 이전에 만든 개체가 즉시 로드되어야 합니다. (그림 03)

- 플레이 모드를 종료합니다.
- Loader에서 BundledObjectLoader 구성 요소를 제거합니다.
에셋 번들을 로드하는 데 사용되는 명령인 AssetBundle.LoadFromFile은 동기식입니다. 즉, 커맨드가 작업을 완료할 때까지(에셋 번들이 완전히 로드될 때까지) 반환되지 않습니다. 이 예제와 같은 작은 번들에는 문제가 없지만, 자동차 또는 건축 사전 시각화 프로그램이나 AAA 비디오 게임에서 볼 수 있듯이 더 큰 번들의 경우 프레임 속도나 응답성이 용납할 수 없는 수준으로 떨어질 수 있습니다. 더 나은 옵션은 LoadFromFileAsync로, 에셋 번들이 로드되는 동안 프로젝트가 계속 실행될 수 있도록 코루틴으로 실행됩니다.
- 라는 새 C# 스크립트를 만들고 첨부합니다. BundleLoaderAsync Loader로.
- 두 번 클릭 BundleLoaderAsync 을 클릭하여 Visual Studio에서 엽니다.
- Update 메서드를 삭제하고 Start의 반환 형식을 void에서 IEnumerator로 변경합니다.
- 4번째 줄에 다음을 입력합니다.
using System.IO;- 다음 변수는 각각 번들 및 에셋 이름으로 채워야 합니다. class definition 안에 다음을 입력합니다.
public string bundleName = "testbundle";
public string assetName = "BundledSpriteObject";- 11번째 줄에서 'void'를 'IEnumerator'로 변경합니다.
- 시작에서 12줄부터 시작하여 다음을 입력합니다.
AssetBundleCreateRequest asyncBundleRequest = AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, bundleName));
yield return asyncBundleRequest;
AssetBundle localAssetBundle = asyncBundleRequest.assetBundle;
if (localAssetBundle == null) {
Debug.LogError("Failed to load AssetBundle!");
yield break;
}
AssetBundleRequest assetRequest = localAssetBundle.LoadAssetAsync<GameObject>(assetName);
yield return assetRequest;
GameObject prefab = assetRequest.asset as GameObject;
Instantiate(prefab);
localAssetBundle.Unload(false);- BundleLoaderAsync가 완료되었습니다. 변경 사항을 저장하고 Unity 에디터로 돌아갑니다.
- 이전과 마찬가지로 번들 오브젝트가 로드되어야 합니다.
- 플레이 모드를 종료하고 Loader에서 BundleLoaderAsync를 제거합니다.
웹에서 에셋 번들을 다운로드하는 것은 로컬 스토리지에서 로드하는 것과 매우 유사합니다. 목적을 위해 파일은 assetbundles라는 디렉토리 내의 로컬 웹 서버에서 호스팅됩니다.
- 라는 C# 스크립트를 만듭니다. BundleWebLoader Loader에 연결합니다.
- BundleWebLoader를 두 번 클릭하여 Visual Studio에서 엽니다.
- 4번째 줄에 다음을 입력합니다.
using System.IO;- 7줄부터 다음과 같이 입력합니다.
public string bundleUrl = "http://localhost/assetbundles/testbundle";
public string assetName = "BundledSpriteObject";- 11줄에서 Start의 반환 형식을 'void'에서 'IEnumerator'로 변경합니다.
- 12줄부터 다음과 같이 입력합니다.
using (WWW web = new WWW(bundleUrl))
{
yield return web;
AssetBundle remoteAssetBundle = web.assetBundle;
if (remoteAssetBundle == null) {
Debug.LogError("Failed to download AssetBundle!");
yield break;
}
Instantiate(remoteAssetBundle.LoadAsset(assetName));
remoteAssetBundle.Unload(false);
}- BundleWebLoader가 완료되었습니다. 변경 사항을 저장하고 Unity 에디터로 돌아갑니다.
- 웹 연결 문제가 없는 한 이전 두 예제와 동일한 결과가 표시되어야 합니다.
9. 결론
에셋 번들은 개발자, 사용자, 플레이어에게 무궁무진한 가능성을 제공합니다. 도움이 되도록 하는 새로운 방법을 생각해낼 것이고 마스터하면 사용자에게 새로운 경험을 제공할 수 있을 것입니다.