사용하는 다양한 유니티 에셋들을 하나로 묶어서 압축한 것이다.
예 : 모델링 객체, 프리팹, 오디오, 텍스처, 씬 등…
using UnityEditor;
using System.IO;
public class CreateAssetBundle
{
[MenuItem("Assets/Build New AssetBundle")]
public static void BuildAssetBundle()
{
string assetBundleDirectory = "Assets/AssetBundles";
if (!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory(assetBundleDirectory); }
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.Android);
AssetDatabase.Refresh();
}
}
using UnityEditor는 개발자가 유니티에서 지원하지 않는 새로운 에디터 기능을 구현할 때 사용하는 네임스페이스로, 해당 네임스페이스를 사용하는 스크립트는 Editor라는 폴더 내에 위치해야 한다. 빌드에는 Editor 폴더는 포함되지 않는다.
using System.IO는 에셋 번들이 위치하게 될 파일을 생성해주기 위해서 사용되었다.
[MenuItem()]를 적용 시켜준 메서드를 메뉴의 기능으로 추가하게 해준다.
if문은 위의 assetBundleDirectory가 가리키는 주소가 존재하는지 확인하고, 없다면은 해당 주소를 가지는 폴더를 생성한다.
BuildPipeline은 코드와 리소스를 각 팰랫폼에 맞는 최적화된 최종 실행 파일 형태로 변환해 주는 과정으로 테스트와 자원 관리의 효율성을 높이고, 최적화된 결과를 도출할 수 있도록 하며, 최종 빌드 크기를 줄일 수 있다. BuildPipeline의 BuildAssetBundles를 실행하면 자동으로 각각의 에셋 번들의 종속성을 나타내는 에셋 번들이 생성되도록 되어있다.
BuildPipline의 BuildAssetBundles을 이용하여서 에셋 번들을 생성한다
BuildPipeline.BuildAssetBundles((에셋 번들이 생성될 경로), (자원이 어떤 방식의 최적화를 통한 압축을 할지 지정), (에셋 번들이 최종 빌드될 환경이나 플랫폼));
AssetDataBase.Refresh()는 에셋 번들를 생성하여도 에디터 상에서 에셋의 데이터 변경을 감지하지 못하여서, 에디터에 표시되지 않는 문제를 해결하기 위해서, 에셋 데이터베이스를 새로 고침 해주는 코드이다.
using System.Collections;
using UnityEngine;
public class LoadAssetBundle : MonoBehaviour
{
public string bundleName = "mybundle";
public string assetName = "myasset";
private void Start()
{
StartCoroutine(LoadAssetBundle());
}
private IEnumerator LoadAssetBundle()
{
string assetBundlePath = Path.Combine(Application.dataPath, "AssetBundles", bundleName);
AssetBundleCreateRequest assetBundleLoadRequest = bundle.LoadFromFileAsync(path);
yield return bundleLoadRequest;
AssetBundle bundle = assetBundleLoadRequest.assetBundle;
if (bundle == null) { yield break; }
AssetBundleRequest assetLoadRequest = bundle.LoadAssetAsync<GameObject>(assetName);
yield return assetLoadRequest;
GameObject loadedAsset = assetLoadRequest.asset as GameObject;
Instantiate(loadedAsset);
bundle.Unload(false);
}
}