[TIL] Unity - Addressable (1) - 동적 로드

MINO·2024년 10월 23일
0

2024-10-23


Asset

게임 개발에 사용되는 모든 리소스를 의미한다.
사운드, 애니메이션, 프리팹, 텍스쳐, 머터리얼 등이 존재한다.

이러한 데이터들은 합쳐서 Asset 이라고 부른다.


에셋 로드 방식

에셋은 정적으로나 동적으로 모두 로드할 수 있다.

정적 로드

유니티 에디터에서 미리 참조하는 방식으로, 게임 오브젝트나 스크립트에 직접 연결하여 사용할 수 있다.
게임 시작 또는 씬 로드 시, Unity 가 자동으로 에셋을 메모리에 로드한다.

  • 자주 사용되는 에셋들에 활용된다. (캐릭터, UI요소 ... )
  • 간단하고 직관적
  • 한 번 로드되면 이후 성능에 큰 부담이 없다.
  • 필요 없는 에셋도 메모리에 미리 로드될 수 있어 메모리 낭비가 발생할 수 있다.

동적 로드

스크립트나 패키지를 통해 에셋을 런타임 중에 불러올 수 있다.

  • 메모리를 효율적으로 관리할 수 있다.
  • 필요할 때만 메모리를 로드하므로, 초기 로딩시간을 단축할 수 있다.
  • 리소스 관리와 해제 작업을 별도로 처리해야 한다.
  • 로드 시점에 로딩 지연이 발생할 수 있다.


기존 개발 프로세스에서 Asset 을 관리할 때 중요한 포인트 → Asset 의 위치
Ex) Resources 폴더에 있을 때 / Local 의 Asset Bundle / Server 의 Asset Bundle
상황에 따라 Asset 을 가져오는 방식이 다르다.


Asset 이 Resource 폴더에 있을 때 불러오는 방법

Resources 폴더에 있는 Asset 은 빌드에 자동으로 포함되며, 런타임 중에 동적으로 로드 할 수 있다.

  • 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 관리 방식 중 하나

  • 텍스쳐, 모델, 오디오, 프리팹 등을 외부 파일로 묶어 빌드하여 런타임 중에 동적으로 로드할 수 있다.
  • 메모리 및 디스크 공간을 효율적으로 사용할 수 있다.
  • 에셋 번들은 로컬 또는 서버에 저장할 수 있다.
  • 플랫폼에 맞게 빌드할 수 있어, 다양한 해상도나 품질의 에셋을 관리할 수 있다.
    ( 모바일 버전 에셋 번들 , 데스크탑 버전 에셋 번들 … )

Asset 이 로컬 폴더에 AssetBundle 로 있을 때 불러오는 방법

에셋을 번들로 묶어 두고, 런타임 중에 동적으로 로드 할 수 있다.

  • 로컬 파일 시스템에 있을 때, AsserBundle.LoadFromFile() 을 사용하여 에셋 번들을 로드할 수 있다.
  • AssetBundle.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);
}

AssetBundle.Unload(bool unloadAllLoadedObjects);

  1. Unload(true) : 번들 파일과 에셋 모두를 메모리에서 Unload 한다.
    • 번들 파일 Unload : 로드된 AssetBundle 파일을 메모리에서 해제
    • 에셋 Unload : 해당 AssetBundle 에서 로드된 모든 에셋도 메모리에서 제거
    • 더 이상 번들이나 에셋을 사용하지 않을 때 ( 씬 전환, 특정 에셋을 더 이상 사용할 필요가 없을 때)
  2. Unload(false) : 번들 파일만 메모리에서 Unload 하고, 번들에서 Load 된 에셋은 계속 메모리에 남겨둔다.
    • 번들 파일 Unload : 로드된 AssetBundle 파일을 메모리에서 해제
    • 에셋 유지 : 해당 AssetBundle 에서 로드된 에셋들은 계속 사용 가능
    • 에셋은 여전히 필요하지만, 더 이상 AssetBundle 파일 자체를 유지할 필요가 없을 때

📌 에셋을 더 이상 사용하지 않으면 true, 계속 사용해야 한다면 false 로 Unload 하는 것이 적합하다.


Asset 이 서버에 AssetBundle 로 있을 때 불러오는 방법

네트워크를 통해 해당 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.");
}


Addressable

Asset Bundle 시스템을 확장하고 개선한 유틸리티

  • Asset 에 주소를 부여하고, 해당 Asset 을 불러올 때 사용한다.
  • 오브젝트가 Server / Resources 폴더 / Local PC 폴더 중 어느 곳에 있던 상관 없다.
    ( Address 만 알고 있으면 접근할 수 있다. )

사용 방법

  1. Addressables 패키지 설치

[Addressables - Description]
개발자가 에셋을 주소로 요청할 수 있도록 해줍니다.
한 번 에셋 (Ex: Prefab)이 "Addressable"로 설정되면, 그 에셋에 주소가 생성되며, 이 주소를 어디서든 호출할 수 있습니다. 에셋이 로컬에 있든, 원격에 있든 시스템은 해당 에셋과 그 의존성을 찾아서 반환해 줍니다.

Addressables은 비동기 로딩을 사용하여 어디에서든 에셋을 로드할 수 있고, 의존성을 포함한 다양한 컬렉션을 지원합니다.
직접 참조, 전통적인 에셋 번들, 또는 Resource 폴더를 사용하고 있더라도, Addressables은 게임을 더욱 동적이고 유연하게 만들 수 있는 더 간단한 방법을 제공합니다.
Addressables은 에셋 번들의 복잡성을 관리하면서 동시에 에셋 번들의 가능성을 열어 줍니다.

1-1. 인스펙터 창에 생긴 Addressable 체크 박스

1-2. Addressable 체크 박스를 활성화 했을 때 생기는 변경점

  • 자동으로 생성된 주소는 변경하여 사용할 수도 있다.

  1. 원하는 에셋을 선택한 후, 해당 에셋에 Address 를 부여 (Windows - Asset Management - Addressables)
  • 그룹을 기준으로 Asset Bundle 이 묶인다.


참고 자료
Tistory - 어드레서블 에셋(Addressable Asset) 의 모든 것
Youtube - 워크플로 속도 향상을 위한 기능 소개#3 어드레서블(Addressables)


TIL 마무리

에셋을 로드하거나 서버에 올리고 다운 받기 등 Addressable 을 활용한 기능이 많지만,
지금 당장은 에셋 번들이나 필요성이 없기 때문에,
추후에 테스트 해보면서 포스팅을 이어 가야겠다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글