Unity/정보

[Unity] 에셋 번들(AssetBundles) 개념 맛 보기

달시_Dalsi 2024. 4. 5. 10:42

에셋 번들 소개

에셋번들이란 asset과 bundle의 합성어이다.  
asset은 유니티 프로젝트에 Assets 폴더가 가장 최상위 폴더인걸 확인할 수 있는데

이 폴더의 하위에 존재하는 것들이 전부 에셋이다.


bundle은 영어뜻으로 묶음 정도로 해석 된다.

즉 Asset들의 묶음이 에셋번들이다.

 

에셋번들은 개발자가 의도한대로 에셋들을 그룹화 시킬 수 있다.

예시용으로 묶은거니 무슨 폴더끼리 묶었는지는 크게 의미두지 말것

 

 

에셋번들을 생성한뒤 에셋번들끼리만 빌드한 뒤 전체 프로젝트 빌드를 하게되면 이 에셋번들을 제외하고 빌드하기에 빌드 용량은 줄어든다.

 

 

이렇게 생성된 전체 프로젝트 빌드파일에 에셋번들 빌드로 생성된 파일을 넣어줘야 제대로 된 실행이 가능하다.

 

예시를 보면 대부분의 스마트폰 게임이 이런 방식을 채용 중이다. 

플레이스토어에서 다운받는 어플 용량이 적어 금방 설치가 되는듯 싶지만 어플을 실행하면 또 다운로드 받는게 존재하는데 이게 용량이 상당하다. 이때 다운받는것이 에셋번들인 셈이다.

 

최근에 나온 스타시드라는 게임을 보면 플레이 스토어에서 받는 용량은 800mb정도다.

설치된후 게임을 실행하면 다음 사진처럼 추가 다운로드가 있는데 용량이 훨씬 크다. 이게 에셋번들이다.

만약 이 에셋번들을 다운로드하지 않는다면 게임은 절대 실행되지 않는다.

고로 에셋번들을 사용할때는 전체 프로젝트 빌드파일 + 에셋번들 파일 = 게임 실행인 셈이다.

 

 

에셋 번들의 장점

에셋 번들을 사용하려면 에셋번들을 고려한 게임 개발, 빌드를 따로 해줘야 한다는 점 그리고 사용자는 2번 다운로드를 해야하는 등 불편한 점들이 여럿있다.

하지만 에셋 번들을 사용했을때 장점이 더 크기에 이용할수 밖에 없다.

 

1 - 게임 설치파일 크기 최소화

에셋 번들을 사용하여 위 예시처럼 최초 게임 설치 파일 크기를 최소화하여 업로드 가능하다. 

플레이스토어에 업로드할때 용량 제한 등이 있기에 용량이 큰게임일수록 에셋번들을 사용해야한다.

사용자 입장에선 당연히 게임 파일 용량을 무시할 수 없기에 작을 수록 유리하다.

 

2 - 콘텐츠 업데이트 관리

패치 내용이 생겼을때 완전히 재설치를 하지 않아도 된다.

패치가 필요한 내용이 담긴 에셋번들만 따로 다운로드해줘도 변경사항이 적용된다.

 

3 - 개발 및 유지 관리 용이성

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

 

 

 

에셋 번들 생성

아래 영상처럼 꾸며진 씬을 이용하여 에셋 번들을 살펴볼것이다.

중앙에서 생성된 수많은 학모형이 각자의 타겟지점을 찾아 움직이고 그 주위를 배회하는 영상이다.

 

 

씬은 다음과같이 배치되어있다.

Spawner 프리팹이 각각 학모형을 생성해 Spawner에 부여되있는 타겟지점 을 학모형에게 부여해준다.

 

Spawner와 PaperCrane이 프리팹으로 사용되니 이 둘을 에셋 번들로 만들어 사용해보자

 

에셋 번들로 만들고자 하는것을 선택한뒤 인스펙터창의 가장 아래쪽을 보면 에셋 번들이 있다.

 

 

New를 눌러 에셋번들을 새로 만들어준다. 예시로 bird로 만들었다.

 

 

이제 이 에셋 번들만 빌드해보자. 

일단 에셋 번들 빌드는 기능을 따로 개발자가 만들어줘야 하기에 다음과같이 유니티 에디터탭에 빌드 버튼이 생성하여 에셋번들 빌드를 할 것이다.

 

BuildPipeline.BuildAssetBundles는 경로, 에셋번들 빌드옵션(압축 방법), 빌드타겟 이렇게 3개의 매개변수가 있다.

이제 방금 만든 스크립트를 Editor폴더에 꼭 넣어준뒤 버튼을 눌러 에셋번들 빌드를 시작하자.

에디터에 의도한대로 버튼이 새로 생겼다.

 

 

이제 에셋 번들이 지정한 경로에 생성된걸 확인할 수 있다.

 

에셋 번들이 생성되었다고 해서 씬에 배치된 그대로 전체 프로젝트 빌드를 하게되면 결국 씬에 포함된 것이기 때문에 에셋 번들로 만든 의미가 없다. 고로 씬을 실행할때 에셋번들에서 불러와 생성시켜야한다.

 

에셋번들로 만든것들을 씬에서 제외시키고 CreateManager를 만들어 에셋번들에서 불러와 다시 배치 시킬 것이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateManager : MonoBehaviour
{
    [SerializeField] Transform[] CreatePoint;

    void Start()
    {
        AssetBundle bundle = AssetBundle.LoadFromFile("AssetBundle/bird");

        var tmp = bundle.LoadAsset<GameObject>("Spawner");
        

        for (int i = 0; i < CreatePoint.Length; i++)
        {
            Instantiate(tmp, CreatePoint[i].position, Quaternion.identity);
        }
    }
}

 

 

처음 영상처럼 학들이 나와 자신들의 타겟지점을 배회하는 원하는 결과가 잘나온다.

 

 

 

 

 

이제 프로젝트 빌드를 한뒤 체크해보자.

에셋 번들이 없는 빌드파일

 

이렇게 빌드 폴더에 에셋번들을 포함시키지 않고 실행하면 아무것도 뜨지 않는다.

 

꼭 에셋번들을 빌드폴더에 포함시킨뒤 실행시키자.

에셋 번들을 포함시킨 빌드파일

 

 

 

결과

컴퓨터 게임이면 몰라도 모바일 게임이면 대부분 사용하고 있는 기술로 요즘에는 좀 더 발전된 어드레서블(Addressables)을 사용하고 있다고 한다. 

이번엔 제목에서 알수있듯이 맛보기로 살펴보았기에 어드레서블의 원조격 기술인 에셋 번들 개념만 익히기 위해 아주 간단한 실습을 진행한거라고 보면 된다.

에셋 번들이 잘 사용되면 참 좋지만 사용하기까지의 과정이 어렵고 복잡하다고 하니 잘 사용해보자.