Print Friendly and PDF

유니티/유니티 이론

[이론] 에셋 번들

나는야 개발자 2025. 6. 18. 07:34
반응형

에셋 번들이란?

- 메인 게임이나 앱과 별도로 저장되어 런타임에 로드되는 콘텐츠이다. 

- 에셋 번들을 통해 필요한 부분만 다운로드 하고 설치가 가능하며 네트워크 및 시스템 리소스에 대한 부담을 최소화 할 수 있다.

- 에셋 번들은 출시 후 콘텐츠 업데이트하거나 추가할때도 사용된다.

 

장점

- 출시 후 콘텐츠 업데이트 및 추가 가능

- 자동 업데이트 및 프로젝트 간 콘텐츠 재사용 가능

*리모트 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