에셋번들은 플랫폼 별 비코드 에셋이 들어있는 아카이브 파일
런타임 시점에 로드할 수 있다.
에셋번들 = 에셋의 묶음, 런타임에 리소스를 다운받을 수 있게 하는 것
에셋 번들 사용 이유:1) 용량을 줄이기 위해 2) 업데이트 쉽게 하기 위해(패치만 받으면 됨)
에셋번들 사용법
1. 에셋번들 빌드
using UnityEditor;
using System.IO; // 빌드이기 때문에 시스템적 기능
public class CreateAssetBundles // Monobehavior를 상속하지 않음
{
[MenuItem("AssetBundle/Build AssetBundles")] // 상단바 메뉴 커스텀
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles"; // 빌드 경로
if (!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory); // 경로가 없으면 만들어 줌
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows); // 경로, 옵션(압축을 어떤식으로 할지), 타겟플랫폼
EditorUtility.DisplayDialog("에셋번들 빌드", "에셋 번들 빌드를 완료했습니다", "완료"); // 에셋번들 빌드하면 나타나는 팝업창
}
}
**주의할 점: 머테리얼은 에셋번들 빌드에 포함하지 않을 것. 머테리얼은 프리펩에 종속되어있기 때문에 머테리얼을 따로 에셋번들로 넣으면 프리펩을 로드했을 때 재질이 깨져서 보임.
2. 에셋번들 로드 및 사용
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class LoadObjFromAssetBundle : MonoBehaviour
{
void Start()
{
var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, "AssetBundles/obj/blue")); // 파일 경로 정확히 넣어야 함.
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
return;
}
var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("TestOBJ"); // 에셋 번들에서 사용한 이름이 아닌, 프리펩으로 저장된 이름을 작성해야 함
Instantiate(prefab);
}
}
3. 에셋번들 Un로드
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class LoadObjFromAssetBundle : MonoBehaviour
{
IEnumerator Start()
{
var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, "AssetBundles/obj/blue")); // 파일 경로 정확히 넣어야 함.
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
yield break;
}
var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("TestOBJ"); // 에셋 번들에서 사용한 이름이 아닌, 프리펩으로 저장된 이름을 작성해야 함
var cube = Instantiate(prefab);
cube.transform.position = Vector3.zero;
yield return new WaitUntil(() => Input.GetMouseButtonDown(0));
myLoadedAssetBundle.Unload(true); // 에셋번들 언로드
Destroy(cube);
}
}
언로드를 통해 할당 받은 에셋번들을 삭제해준다.