2024-10-23
게임 개발에 사용되는 모든 리소스를 의미한다.
사운드, 애니메이션, 프리팹, 텍스쳐, 머터리얼 등이 존재한다.
이러한 데이터들은 합쳐서 Asset 이라고 부른다.
에셋은 정적으로나 동적으로 모두 로드할 수 있다.
유니티 에디터에서 미리 참조하는 방식으로, 게임 오브젝트나 스크립트에 직접 연결하여 사용할 수 있다.
게임 시작 또는 씬 로드 시, Unity 가 자동으로 에셋을 메모리에 로드한다.
스크립트나 패키지를 통해 에셋을 런타임 중에 불러올 수 있다.
기존 개발 프로세스에서 Asset 을 관리할 때 중요한 포인트 → Asset 의 위치
Ex) Resources 폴더에 있을 때 / Local 의 Asset Bundle / Server 의 Asset Bundle
상황에 따라 Asset 을 가져오는 방식이 다르다.
Resources
폴더에 있는 Asset 은 빌드에 자동으로 포함되며, 런타임 중에 동적으로 로드 할 수 있다.
Resources
폴더에 넣고, 런타임 중에 Resources.Load
메서드를 통해 로드한다.Resources
폴더에 있는 모든 에셋은 빌드 시 자동으로 포함되므로, 지나치게 많은 에셋을 Resources
에 넣을 경우 빌드 크기와 메모리 사용량이 증가할 수 있다.GameObject myPrefab = Resources.Load<GameObject>("MyPrefab");
AudioClip myClip = Resources.Load<AudioClip>("Sounds/MySound");// Resources/Sounds 안에 있는 MySound 클립
Asset Bundle : Unity 의 Asset 관리 방식 중 하나
- 텍스쳐, 모델, 오디오, 프리팹 등을 외부 파일로 묶어 빌드하여 런타임 중에 동적으로 로드할 수 있다.
- 메모리 및 디스크 공간을 효율적으로 사용할 수 있다.
- 에셋 번들은 로컬 또는 서버에 저장할 수 있다.
- 플랫폼에 맞게 빌드할 수 있어, 다양한 해상도나 품질의 에셋을 관리할 수 있다.
( 모바일 버전 에셋 번들 , 데스크탑 버전 에셋 번들 … )
에셋을 번들로 묶어 두고, 런타임 중에 동적으로 로드 할 수 있다.
AsserBundle.LoadFromFile()
을 사용하여 에셋 번들을 로드할 수 있다.string path = Path.Combine(Application.streamingAssetsPath, "myassetbundle");
AssetBundle bundle = AssetBundle.LoadFromFile(path);
if(bundle != null)
{
GameObject myPrefab = bundle.LoadAsset<GameObject>("MyPrefab");
bundle.Unload(false);
}
📌 에셋을 더 이상 사용하지 않으면 true
, 계속 사용해야 한다면 false
로 Unload 하는 것이 적합하다.
네트워크를 통해 해당 AssetBundle 을 다운로드하고 로드해야 한다.
UnityWebRequest
를 사용하여 에셋 번들을 서버에서 다운로드한다.void Start()
{
string bundleUrl = "https://example.com/myassetbundle";
StartCoroutine(DownloadAndLoadAssetBundle(bundleUrl);
}
IEnumerator DownloadAndLoadAssetBundle(string url)
{
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
yield return request.SendWebRequest();
if(request.result != UnityWebRequest.Result.Success)
{
Debug.LogError("Failed to download AssetBundle: " + request.error);
yield break;
}
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
if(bundle != null)
{
GameObject myPrefab = bundle.LoadAsset<GameObject>("MyPrefab");
if(myPrefab != null)
Instantiate(myPrefab);
bundle.Unload(false);
}
else
Debug.LogError("Failed to load AssetBundle from server.");
}
Asset Bundle 시스템을 확장하고 개선한 유틸리티
Server
/ Resources
폴더 / Local PC
폴더 중 어느 곳에 있던 상관 없다.[Addressables - Description]
개발자가 에셋을 주소로 요청할 수 있도록 해줍니다.
한 번 에셋 (Ex: Prefab)이 "Addressable"로 설정되면, 그 에셋에 주소가 생성되며, 이 주소를 어디서든 호출할 수 있습니다. 에셋이 로컬에 있든, 원격에 있든 시스템은 해당 에셋과 그 의존성을 찾아서 반환해 줍니다.Addressables은 비동기 로딩을 사용하여 어디에서든 에셋을 로드할 수 있고, 의존성을 포함한 다양한 컬렉션을 지원합니다.
직접 참조, 전통적인 에셋 번들, 또는 Resource 폴더를 사용하고 있더라도, Addressables은 게임을 더욱 동적이고 유연하게 만들 수 있는 더 간단한 방법을 제공합니다.
Addressables은 에셋 번들의 복잡성을 관리하면서 동시에 에셋 번들의 가능성을 열어 줍니다.
1-1. 인스펙터 창에 생긴 Addressable 체크 박스
1-2. Addressable 체크 박스를 활성화 했을 때 생기는 변경점
참고 자료
Tistory - 어드레서블 에셋(Addressable Asset) 의 모든 것
Youtube - 워크플로 속도 향상을 위한 기능 소개#3 어드레서블(Addressables)
에셋을 로드하거나 서버에 올리고 다운 받기 등 Addressable 을 활용한 기능이 많지만,
지금 당장은 에셋 번들이나 필요성이 없기 때문에,
추후에 테스트 해보면서 포스팅을 이어 가야겠다.