Unity 에셋 번들 사용법 안내서
이 매뉴얼에서는 Unity의 에셋 번들(AssetBundles) API를 사용하여 다양한 방식으로 에셋을 로드하는 방법을 설명합니다. 또한 여러 활용 예제를 제공합니다.
에셋 번들 API 소개
Unity에서는 에셋 번들을 로드하는 데 사용할 수 있는 여러 가지 API를 제공합니다. 각 API는 사용되는 플랫폼과 압축 방식에 따라 동작이 달라집니다.
| API 기능 | 설명 |
|---|---|
| AssetBundle.LoadFromFile | 로컬 파일에서 비압축된 에셋 번들을 로드합니다. |
| AssetBundle.LoadFromMemoryAsync | 메모리에서 압축된 에셋 번들을 비동기적으로 로드합니다. |
| UnityWebRequestAssetBundle | 웹을 통해 에셋 번들을 다운로드하고 로드합니다. |
| WWW.LoadFromCacheOrDownload | 웹에서 캐시를 사용해 에셋 번들을 로드합니다. |
AssetBundle.LoadFromMemoryAsync
이 메서드는 에셋 번들 데이터가 포함된 바이트 배열을 사용하여 에셋 번들을 로드합니다. LZMA로 압축된 경우 압축 해제를 수행합니다. 다음은 예제입니다.
using UnityEngine;
using System.Collections;
using System.IO;
public class Example : MonoBehaviour
{
IEnumerator LoadFromMemoryAsync(string path)
{
AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
yield return createRequest;
AssetBundle bundle = createRequest.assetBundle;
var prefab = bundle.LoadAsset<GameObject>("MyObject");
Instantiate(prefab);
}
}
AssetBundle.LoadFromFile
이 API는 로컬 스토리지에서 비압축된 번들을 로드하는 데 매우 효율적입니다.
using System.IO;
using UnityEngine;
public class LoadFromFileExample : MonoBehaviour
{
void Start()
{
var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
return;
}
var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
Instantiate(prefab);
}
}
UnityWebRequestAssetBundle
웹에서 에셋 번들을 다운로드하기 위해 UnityWebRequestAssetBundle을 사용할 수 있습니다. 다음은 예제입니다.
IEnumerator InstantiateObject()
{
string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;
UnityEngine.Networking.UnityWebRequestAssetBundle request
= UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(uri, 0);
yield return request.SendWebRequest();
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
GameObject cube = bundle.LoadAsset<GameObject>("Cube");
GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
Instantiate(cube);
Instantiate(sprite);
}
에셋 로드 방법
에셋 번들에서 에셋을 로드하는 방법은 여러 가지가 있습니다. 동기식 및 비동기식 방법 모두 사용할 수 있습니다.
| 메서드 명 | 설명 |
|---|---|
| LoadAsset |
단일 에셋을 동기식으로 로드합니다. |
| LoadAllAssets() | 모든 에셋을 동기식으로 로드합니다. |
| LoadAssetAsync |
단일 에셋을 비동기식으로 로드합니다. |
| LoadAllAssetsAsync() | 모든 에셋을 비동기식으로 로드합니다. |
에셋 번들 매니페스트 로드
에셋 번들 매니페스트를 통해 에셋 번들의 종속성을 관리할 수 있습니다. 매니페스트를 로드하는 예제는 다음과 같습니다.
AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] dependencies = manifest.GetAllDependencies("assetBundle");
foreach(string dependency in dependencies)
{
AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency));
}
관리 및 정리
로드된 에셋 번들은 필요할 때 언로드해야 합니다. 이 작업은 메모리 관리를 위해 중요합니다.
| 메서드 명 | 설명 |
|---|---|
| AssetBundle.Unload(true) | 모든 오브젝트와 그 종속성도 언로드합니다. |
| AssetBundle.Unload(false) | 오브젝트는 유지하며 에셋 번들만 언로드합니다. |
에셋 번들을 관리하고 사용하는 과정에서 이러한 메서드의 사용은 사용자의 필요에 따라 조정할 수 있습니다. 프로젝트에서는 필요할 때마다 적절한 시점에 불필요한 에셋 번들을 언로드하는 것이 중요합니다.
이 문서는 Unity의 에셋 번들 API를 활용하여 게임 개발의 효율성을 높이는 데 도움을 줄 것입니다. 추가적인 질문이 있다면 Unity 공식 문서나 포럼을 참고하시기 바랍니다.