[TIL] Unity Addressables

Dreamer·2024년 11월 20일

1. 오늘 주제

Addressables 에 대해 간단하게 남겨 본다.

Addressables 이란

유니티에서 제공하는 에셋 관리 시스템으로 에셋을 주소로 식별하여 유연한 로딩, 언로딩, 배포를 가능하게 한다.

Addressables 를 사용 하면 좋은 점은 에셋을 주소로 관리하여 참조 및 로딩이 간단해지고, 비동기로 작동하기 때문에 성능과 응답성을 향상 시킨다. 그리고 메모리 관리도 향상 되어 사용하지 않는 에셋을 언로드하여 최적화 할 수 있다.
마지막으로 최고의 장점은 에셋 묶음을 원격 서버에 업로드하여 어플리케이션을 자체 업데이트 하지 않고 컨텐츠를 갱신 할 수 있다.

2. 사용 방법

  1. 패키지 설치

    • PackageManager -> Unity Registry 에서 Addressables 를 검색하여 설치 할 수 있다.
  2. 에셋 Addressables로 설정

    • Addressables의 Group 창을 열고 Make Addressable 을 하여 사용하고자 하는 에셋들을 Addressables로 설정 하여 사용 하면 된다.
  3. 코드에서 불러오기

    • 아래 코드처럼 Addressables로 등록된 에셋을 비동기적으로 로드 할 수 있다.
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddressableExample : MonoBehaviour
{
    void Start()
    {
        string assetKey = "MyPrefab"; // 로드할 에셋의 주소

        // 에셋 로드
        Addressables.LoadAssetAsync<GameObject>(assetKey).Completed += OnLoadDone;
        // 에셋 인스턴스화
        Addressables.InstantiateAsync(assetKey).Completed += OnInstantiateDone;
        
        // 에셋 해제
        Addressables.Release(obj);
        // 인스턴스화 된 게임 오브젝트 해제
        Addressables.ReleaseInstance(instance);
    }

    private void OnLoadDone(AsyncOperationHandle<GameObject> obj)
    {
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
            GameObject prefab = obj.Result;
            Instantiate(prefab); // 에셋 인스턴스화
        }
        else
        {
            Debug.LogError("에셋 로드 실패: " + obj.OperationException);
        }
    }
    
    private void OnInstantiateDone(AsyncOperationHandle<GameObject> obj)
    {
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
            GameObject instance = obj.Result;
            // 인스턴스화된 게임 오브젝트 사용
        }
        else
        {
            Debug.LogError("에셋 인스턴스화 실패: " + obj.OperationException);
        }
    }
}
  1. 런타임에 원격 서버에서 업데이트 확인
    • Addressables.CheckForCatalogUpdates 함수를 통해 업데이트 가능한 에셋이 있는지 미리 탐색하여 다운로드 받아 사용 할 수 있다.
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddressableExample : MonoBehaviour
{
    void Start()
    {
    	// 업데이트 체크
		Addressables.CheckForCatalogUpdates().Completed += OnCatalogCheckDone;
    }

    private void OnCatalogCheckDone(AsyncOperationHandle<List<string>> obj)
    {
        if (obj.Result.Count > 0)
        {
            // 업데이트가 있는 경우 다운로드
            Addressables.UpdateCatalogs(obj.Result).Completed += OnCatalogUpdateDone;
        }
    }

    private void OnCatalogUpdateDone(AsyncOperationHandle<List<IResourceLocator>> obj)
    {
        // 업데이트 완료 후 에셋 로드 가능
    }
}

3. 추가 팁 및 주의사항

  • 에셋 주소 관리: 주소는 고유해야 하며, 에셋의 위치 변경 시 주소가 변경되지 않도록 주의 해야 한다.
  • 디버그 및 로깅: 에셋 로드 실패 시 로그를 통해 원인을 파악할 수 있다.
  • 메모리 관리: 사용하지 않는 에셋은 반드시 해제하여 메모리 누수를 방지 해야 한다.
  • 플랫폼별 설정: 플랫폼에 따라 빌드 및 로드 경로를 다르게 설정할 수 있다.

Unity Addressables 공식 문서
한글문서는 오래전 문서니 최근 문서를 번역해서 보도록 하자..

profile
새로운 시작

0개의 댓글