앤디가이 블로그

Unity에서 앱 최적화 및 콘텐츠 분리의 핵심 기능인 어드레서블(Addressable) 사용 방법에 대해 알아보자.

 

어드레서블에 대한 패키지 설치를 안 했다면, 기존 페이지를 참고하고 진행하는 것이 좋다.

2022.08.12 - [unity3d/Research] - [unity] 어드레서블(Addressable) 소개 및 설치 방법

 

[unity] 어드레서블(Addressable) 소개 및 설치 방법

Unity에서 앱 최적화 및 콘텐츠 분리의 핵심 기능인 어드레서블(Addressable)에 대해 알아보자. 1. 어드레서블(Addressable)이란? 유니티에서 그동안 메인 앱과 콘텐츠를 나눠서 개발할 때(Apk 용량을 줄이

wonjuri.tistory.com

 

1. 기본 세팅

어드레서블 패키지 설치를 완료했다면 Asset Management 메뉴가 활성화된다.

Window 항목의 Asset Management 를 선택 후 Addressables 항목의 Groups를 눌러준다.

어드레서블 Groups 설정
어드레서블 Groups 설정

 

'Create Addressales Settings' 버튼을 눌러 어드레서블 설정창을 생성해준다.

 

 

설정창 항목에 상당히 많은 옵션들이 있는데. 우선 기본(Local)으로 설정되어 있는 상태로 진행을 해보자.

어드레서블 그룹 생성
어드레서블 그룹 생성

 

Scene 화면에 Cube를 하나 생성한 후 Prefab으로 만들어 준다.

해당 Prefab을 보면 Addressable 이란 체크 항목이 생기고, 경로를 입력한다.

해당 경로는 Prefab에서 고유해야 하기 때문에 중첩되지 않도록 하는 것이 중요하다.( 주소의 개념 )

유니티 프리팹 Addressable 활성화
유니티 프리팹 Addressable 활성화

 

Addressable Groups를 다시 활성화해보면, 체크한 프리팹이 그룹으로 잘 할당된 것을 확인할 수 있다.

어드레서블 그룹 뷰
어드레서블 그룹 뷰

 

2. 번들 빌드해보기

빌드 모드의 경우 3가지를 지원한다. 기본 fastest로 에디터에서 테스트 후 Existing에서 실 기기 테스트를 하는 것이 좋다.

 

 

  • Use Asset Database (fastest) : 에디터용 빌드이다. 에디터에서 테스트 시 사용하면 좋다.
  • Simulate Groups (advanced) : 에디터용 빌드로 같지만 주소에 대한 기능을 테스트하는 것으로 좀 더 전문적으로 테스트가 가능하다.
  • Use Existing : 실제 동작하는 기기에서 동적으로 테스트할 경우 사용한다.

어드레서블 번들 빌드 옵션
어드레서블 번들 빌드 옵션

 

빌드 실행의 경우 3가지 옵션을 선택할 수 있다. ( 처음에는 기본 Default Build로 진행 )

  • Default Build Script : 패키지에서 제공해주는 기본 빌드 스크립트이다. 해당 항목을 눌러 번들 빌드를 수행한다.
  • Update a Previous Build : 이미 빌드가 되어 있는 상태에서 몇 개의 수정사 항만 있을 때 업데이트해주는 항목이다.
  • Clear Build Cache : 이미 빌드해놓은 번들 빌드를 모두 지우고 새로 세팅할 때 사용하는 항목이다.

Addressable 빌드 옵션
Addressable 빌드 옵션

기본으로 제공하는 메뉴와 별개로 스크립트를 통해서 빌드를 수행하고 싶다면 해당 함수를 호출하여 빌드할 수 있다.

AddressableAssetSettings.BuildPlayerContent()

 

 

3. Addressable 사용

Addressable 사용을 위해서는 스크립트에 다음과 같은 using을 해줘야 한다.

using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

 

3-1. 번들 다운로드 시

CDN처럼 번들을 서버에 올려놓고 받을 때 사용하는 함수는 다음과 같이 작성하여 호출해 주면 된다.

    /// <summary>
    /// 어드레서블 다운로드 함수.
    /// </summary>
    /// <param name="key"></param>
    public void DownloadDependenciesAsync(object key)
    {
        Addressables.GetDownloadSizeAsync(key).Completed += (opSize) =>
        {
            
            if(opSize.Status == AsyncOperationStatus.Succeeded && opSize.Result > 0)
            {
                Addressables.DownloadDependenciesAsync(key, true).Completed += (opDownload) =>
                 {
                     if (((AsyncOperationHandle)opDownload).Status != AsyncOperationStatus.Succeeded)
                         return;

                     //다운로드 완료 처리.
                 };
            }
            else
            {
                //이미 다운로드가 완료된 상태 처리.
            }
        };
    }

 

3-2. 번들 로드 시

필요한 번들을 로드 시 아래와 같이 작성해주면 된다.

    public void LoadAssetAsync(object key)
    {
        try
        {
            Addressables.LoadAssetAsync<GameObject>(key).Completed += (op) =>
            {
                if (((AsyncOperationHandle<GameObject>)op).Status == AsyncOperationStatus.Succeeded)
                    return;

                //로드 완료 처리.
            };
        }
        catch(Exception e) { Debug.LogError(e.Message); }
    }

 

3-3. 로드한 번들 생성 시

Editor에 AssetReference를 캐싱받은 후 번들을 생성하는 경우 다음과 같이 작성해주면 된다.

 

 

    //Addressable 프리팹 할당
    public AssetReference SpawnablePrefab;

    public void CreatePrefab()
    {
        List<AsyncOperationHandle<GameObject>> handles = new List<AsyncOperationHandle<GameObject>>();

        AsyncOperationHandle<GameObject> handle = SpawnablePrefab.InstantiateAsync();
        handles.Add(handle);
    }

 

3-4. 로드한 번들 해제 시

생성된 번들을 해제(삭제) 시에는 다음 코드를 작성해주면 된다.

        //어드레서블 프리팹 해제
        foreach (var handle in handles)
            Addressables.Release(handle);

 

4. 정리

기본 로컬 상황에서 어드레서블에 대한 사용법에 대해 살펴봤다. 서버 호스팅과 Remote 방식은 개인적으로 좀 더 스터디가 필요해 보인다.

어드레서블 시스템은 아직까지 에셋번들이 익숙하다 보니 아직까지는 조금 생소한 느낌이다. 개인적으로 프로젝트에 적용을 해봐야 좀 더 편의성을 느껴볼 수 있을 것 같다. 

주소 관리와 캐싱 처리 등에 대한 부분을 알아서 해주기 때문에 한번 구축해 놓으면 손이 덜 갈 것 같은 장점은 확실히 있다. 비동기 처리가 되는 점도 상당히 좋은 점이다. UniTask와 궁합도 좋을 것 같다.

 

 

참고 자료 

https://docs.unity3d.com/Packages/com.unity.addressables@1.20/manual/index.html

 

Addressables | Addressables | 1.20.5

Addressables The Addressables system provides tools and scripts to organize and package content for your application and an API to load and release assets at runtime. When you make an asset "Addressable," you can use that asset's address to load it from an

docs.unity3d.com

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band