[Unity/C#]에셋번들

강동현·2023년 12월 7일
0

Unity/C#

목록 보기
1/26

1. 에셋 번들(Asset Bundle)

1. 에셋 번들이란?

  • 에셋(asset): Unity에서 asset은 project 창에셋폴더 안에 있는 모든 것
  • 번들(bundle): 묶음
  • 에셋번들: 에셋별로 묶어서 정리하는 방식
  • 에셋번들 빌드: 에셋별로 묶어 나눠서 빌드하는 방식
  • 모바일 게임을 설치 시, 앱스토어에서 다운받는 용량은 크지 않으나, 막상 설치 후 실행 시, 어마한 양의 데이터를 다운받는다.
  • 위 방식이 에셋번들을 활용한 기술
  • 어드레서블(Addressable)에셋번들의 상위기술(어렵지만, 막강한 기능)

2. 에셋 번들 장단점

단점

  • 에셋 별 분리(정리) 필수
  • 빌드 분리(빌드 여러번 수행)
  • 설치 분리(설치 후 에셋번들 설치)

단점보다 장점이 너무 크다.

장점

  • 용량: 에셋빌드를 제외한 나머지 부분으로만 빌드가 이뤄지므로 최종 빌드 용량이 줄어들음
    -스토어 등록 용량제한에서 자유로워짐
  • 패치: 통째로 빌드 시, 모든 용량을 재설치해야 함
    -에셋번들 사용시, 에셋번들만 추가 다운로드 시, 변경사항 적용 가능

3. 에셋 번들 사용법

3-1. 에셋 번들 묶기

EDGE EDGE
  • 프로젝트 우측 하단 에셋 번들 생성 및 설정
  • 일반적으론 같은 형태 타입(Materials, Animations, ...)끼리 묶어서 적용

3-2. 에셋 번들 빌드

에셋 번들 빌드는 코드로 구현
해당 파일은 반드시 Editor 폴더에 넣어줘야 한다.

AssetBundleBuildManager.cs

  • 위 파일은 에디터에 탭을 추가하는 커스텀 에디터 기술이 담김
using System.IO; //build를 위함
using UnityEditor; //User Editor 사용을 위함
using UnityEditor.Experimental;
public class AssetBundleBuildManager
{
    [MenuItem("MyTool/Asset Bundle Build")]
    public static void AssetBundleBuild()
    {
        //현재 경로 하위 Bundle 폴더
        string directory = "./Bundle";
        //경로가 존재하지 않는 경우 경로 생성
        if (!Directory.Exists(directory)){
            Directory.CreateDirectory(directory);
        }
        //인자: 경로, 에셋번들 옵션(압축방법), 타겟 플랫폼
        BuildPipeline.BuildAssetBundles(directory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
        //디버깅(확인)
        EditorUtility.DisplayDialog("에셋 번들 빌드", "에셋 번들 빌드를 완료했습니다.", "완료");
    }
}
EDGE
  • (빌드 폴더가 없는 경우 빌드 폴더가 생성)
  • 빌드 폴더 내 빌드 파일이 생성된다.

3-2. 에셋번들 중복 제거

중복제거: 이 경우 에셋은 에셋 빌드 + 최종 빌드에 중복존재하므로, 스크립트를 통해 중복제거 수행

  • 하이어라키 상의 오브젝트는 삭제
  • LoadManager 오브젝트 추가 후, 아래 동적으로 몬스터를 생성하는 스크립트(커스텀 필수) 작성 후 부착

LoadManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoadManager : MonoBehaviour
{
    IEnumerator Start()
    {
        AssetBundle asset = AssetBundle.LoadFromFile("Bundle/monster");
        if (asset != null) yield break;
        var ghoul = asset.LoadAsset<GameObject>("ghoul");
        var monster = Instantiate(ghoul);
        monster.transform.position = Vector3.zero;
    }
}

3-3. 에셋번들을 제대로 사용하기 위해선...

  • 이 상태에서 빌드 결과물(실행파일) 실행 시, 정상 실행 X -> 빌드 파일 설치가 안되어있기 때문
  • 클라우드 or 스토리지 등에 빌드 파일을 업로드하고, 프로그램 실행 시, 빌드파일을 다운로드하는 과정을 개발해야 한다.
  • 에셋번들을 불러와 사용할 경우, 에셋번들이 메모리에 할당되어 등록되는데, 사용하지 않게 되는 경우, 게임 오브젝트를 파괴할 뿐만 아니라 수동으로 메모리에 할당된 에셋번들을 해제(Unload)해야 한다. -> (하지 않는다면,)메모리가 가득 차 게임이 다운됨
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
public class LoadManager : MonoBehaviour
{
    IEnumerator Start()
    {
        AssetBundle asset = AssetBundle.LoadFromFile("Bundle/monster");
        if (asset != null) yield break;
        var ghoul = asset.LoadAsset<GameObject>("ghoul");
        var monster = Instantiate(ghoul);
        monster.transform.position = Vector3.zero;
        yield return new WaitUntil(() => IsDead(true));//몬스터가 죽을 때,
        asset.Unload(true);//에셋번들 언로드
        Destroy(monster);//몬스터 파괴
    }
    bool IsDead(bool check)
    {
        return check;
    }
}

유용한 에셋번들 툴도 많기 때문에 활용하자★

profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글