에셋 번들이란?
- 메인 게임이나 앱과 별도로 저장되어 런타임에 로드되는 콘텐츠이다.
- 에셋 번들을 통해 필요한 부분만 다운로드 하고 설치가 가능하며 네트워크 및 시스템 리소스에 대한 부담을 최소화 할 수 있다.
- 에셋 번들은 출시 후 콘텐츠 업데이트하거나 추가할때도 사용된다.
장점
- 출시 후 콘텐츠 업데이트 및 추가 가능
- 자동 업데이트 및 프로젝트 간 콘텐츠 재사용 가능
*리모트 AssetBundle로 변경 사항을 확인 한 후 로컬에 저장된 에셋 번들을 다운로드 받을 수 있음
배리언트
- 배리언트를 이용하여 동일한 이름으로 bundlename을 지을 수 있어, 플랫폼 또는 상황별로 가져올 수 있음
- 단, 배리언트를 사용하면 특정 부분만 배리언트로 가져온다가 되지 않고 해당 bundlename의 배리언트를 무조건 다 가져와야함
- 위 이미지로 예시를 들면 현재 플랫폼이 ConsoleA라면 LeftActionButton.ConsoleA의 에셋을 가져올 수 있어, 플랫폼 별로 원하는 이미지를 가져오는게 가능함
에셋 번들 생성
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);
}
}
- 유니티에 Editor 폴더를 만든 후 위 CreateAssetBundles 클래스 생성
- "BuildAssetBundleOptions.None"의 경우 여러 옵션들이 존재하며 선택사항
- "EditorUserBuildSettings.activeBuildTarget"값의 경우 플랫폼에 맞게 설정
- CreateAssetBundles로 만든 Build AssetBundles 버튼을 이용해 디렉토리 폴더를 우선 설정
- scene에 테스트용 오브젝트 추가 후 프리팹으로 만들면 인스펙터에 AssetBundle이 보임
- New...을 클릭하여 testbundle 추가하여 설정
- 왼쪽 none을 클릭하여 배리언트 설정 가능
public string assetName = "BundledSpriteObject";
public string bundleName = "testbundle";
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
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);
}
1. test용 스크립트를 하나 만든 후 위 코드를 추가
2. 빈 오브젝트에 스크립트 할당 후 play하면 아까 testbundle로 설정한 오브젝트 생성되는 것을 확인할 수 있음
public IEnumerator asyncload()
{
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);
}
- 위 코드를 이용해 비동기식 로드도 가능
마무리 정리
- 지금까지 에셋 번들에 대해 알아보았습니다. 에셋 번들은 어드레서블이 나오기 이전에 사용되었던 에셋 관리 시스템이며 위에 내용엔 나와있지 않았지만, 개인적으로 생각하는 어드레서블과 에셋 번들의 큰 차이점은 종속성 처리로 보입니다. 어드레서블은 동일한 재료(메테리얼, 이미지 등)을 자동종속처리 해주지만 에셋 번들은 자동처리 해주지 않는 점이 가장 큰 차이점이라 보입니다.
참고링크 : 바로가기
Asset Bundles 소개 - Unity Learn
에셋 번들(AssetBundle)은 메인 게임이 애플리케이션과 별도로 저장되고 런타임에 로드(또는 모바일 및 온라인 앱의 경우 다운로드)되는 콘텐츠입니다. 이를 통해 고객은 필요한 부품만 다운로드하
learn.unity.com
'유니티 > 유니티 이론' 카테고리의 다른 글
[이론] ECS (0) | 2025.06.26 |
---|---|
[이론] 렌더 파이프 라인 (5) | 2025.06.23 |
[이론] Addressable (0) | 2025.06.15 |
[이론] UniTask (3) | 2025.06.12 |
[이론] async/await (0) | 2025.06.11 |