- 에셋(asset): Unity에서 asset은 project 창에 에셋폴더 안에 있는 모든 것
- 번들(bundle): 묶음
- 에셋번들: 에셋별로 묶어서 정리하는 방식
- 에셋번들 빌드: 에셋별로 묶어 나눠서 빌드하는 방식
- 모바일 게임을 설치 시, 앱스토어에서 다운받는 용량은 크지 않으나, 막상 설치 후 실행 시, 어마한 양의 데이터를 다운받는다.
- 위 방식이 에셋번들을 활용한 기술
- 어드레서블(Addressable)은 에셋번들의 상위기술(어렵지만, 막강한 기능)
단점
- 에셋 별 분리(정리) 필수
- 빌드 분리(빌드 여러번 수행)
- 설치 분리(설치 후 에셋번들 설치)
장점
- 용량: 에셋빌드를 제외한 나머지 부분으로만 빌드가 이뤄지므로 최종 빌드 용량이 줄어들음
-스토어 등록 용량제한에서 자유로워짐- 패치: 통째로 빌드 시, 모든 용량을 재설치해야 함
-에셋번들 사용시, 에셋번들만 추가 다운로드 시, 변경사항 적용 가능
- 프로젝트 우측 하단 에셋 번들 생성 및 설정
- 일반적으론 같은 형태 타입(Materials, Animations, ...)끼리 묶어서 적용
에셋 번들 빌드는 코드로 구현
해당 파일은 반드시 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("에셋 번들 빌드", "에셋 번들 빌드를 완료했습니다.", "완료"); } }
- (빌드 폴더가 없는 경우 빌드 폴더가 생성)
- 빌드 폴더 내 빌드 파일이 생성된다.
중복제거: 이 경우 에셋은 에셋 빌드 + 최종 빌드에 중복존재하므로, 스크립트를 통해 중복제거 수행
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; } }
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;
}
}