[unity] 어드레서블(Addressable) 사용 방법(로컬기반)
Unity에서 앱 최적화 및 콘텐츠 분리의 핵심 기능인 어드레서블(Addressable) 사용 방법에 대해 알아보자.
어드레서블에 대한 패키지 설치를 안 했다면, 기존 페이지를 참고하고 진행하는 것이 좋다.
2022.08.12 - [unity3d/Research] - [unity] 어드레서블(Addressable) 소개 및 설치 방법
1. 기본 세팅
어드레서블 패키지 설치를 완료했다면 Asset Management 메뉴가 활성화된다.
Window 항목의 Asset Management 를 선택 후 Addressables 항목의 Groups를 눌러준다.
'Create Addressales Settings' 버튼을 눌러 어드레서블 설정창을 생성해준다.
설정창 항목에 상당히 많은 옵션들이 있는데. 우선 기본(Local)으로 설정되어 있는 상태로 진행을 해보자.
Scene 화면에 Cube를 하나 생성한 후 Prefab으로 만들어 준다.
해당 Prefab을 보면 Addressable 이란 체크 항목이 생기고, 경로를 입력한다.
해당 경로는 Prefab에서 고유해야 하기 때문에 중첩되지 않도록 하는 것이 중요하다.( 주소의 개념 )
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 : 이미 빌드해놓은 번들 빌드를 모두 지우고 새로 세팅할 때 사용하는 항목이다.
기본으로 제공하는 메뉴와 별개로 스크립트를 통해서 빌드를 수행하고 싶다면 해당 함수를 호출하여 빌드할 수 있다.
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
댓글