처음이시라면 기본 정보를 보고나서 보시길 추천드립니다.
https://dev-junwoo.tistory.com/159
어드레서블을 사용한다는건 로컬에서만 사용하면서 편하게 리소스 관리를 할 목적일수도 있지만,
처음 어플 다운 용량을 줄이고 서버에서 추가적인 리소스를 다운받을 수 있게 하면서 어플 업데이트 없이 번들 업데이트를 통한 패치를 위한 목적도 있다.
어드레서블 설정
기본 어드레서블 설정 - Catalog 에서 2가지 옵션을 선택해줘야한다.
원격 카탈로그 빌드 체크와 그 빌드/로드 경로를 Remote로 설정해준다.
Build & Load Paths를 Remote로 설정하면, 프로필에서 설정한 Remote 경로를 가져온다.
그룹 설정
나는 예시로 GroupA와 GroupB 라는 2개의 그룹을 만들었다.
이제 여기서 내가 어떤 그룹을 서버에서 가져올건지 설정을 해주어야한다.
그룹을 클릭하면 해당 설정창이 뜬다.
여기서도 상단에 Build & Load Paths 가 있는데, 어드레서블 설정과 똑같이 Remote로 설정해준다.
이제 이러면 기본적인 준비는 끝이 났다.
빌드
이제 어드레서블 그룹창에서 Build - New Build - Default Build Script 를 클릭해서 빌드를 하면된다.
빌드를 하면 우리는 2가지 부분을 살펴보면 된다.
로컬 카탈로그 및 번들
프로젝트/라이브러리/com.unity.addressables/aa/빌드타겟
기본 경로를 수정하지 않았다면 위와같은 경로로 파일이 생성된다.
로컬 카탈로그와 어드레서블 세팅 값이 들어가있는 json파일,
그리고 난 안드로이드 빌드를 했는데, Android 폴더 안에는 로컬 번들이 들어가 있다.
원격 카탈로그 및 번들
프로젝트/ServerData/빌드 타겟
기본 경로를 수정하지 않았다면 위와 같은 경로로 파일이 생성된다.
나오는 파일은 카탈로그,번들 (Remote로 설정한 그룹들의), 그리고 hash값을 비교하기위한 hash 파일이다.
여기서 나오는 카탈로그는 내가 위에 로컬 카탈로그라고 쓴 카탈로그와 완벽히 똑같은 사본이다.
( Default Build Script로 했을때의 기준)
서버에는 이 파일들만 올려주면 된다.
그리고 어드레서블 설정에 따라 다르겠지만 위에 설정한 경로로 addressable_content_state.bin 파일도 생성된다.
이 파일은 번들 업데이트를 할 때 필요한 파일이다.
카탈로그
카탈로그는 어드레서블의 핵심적인 파일이다.
요약하면 자산의 들의 라벨 정보, 주소를 키(id)로 매핑한 정보들을 들고있으므로 우리가 어드레서블을 사용하려면 무조건 있어야하는 파일이다.
카탈로그 파일을 열어보면 무엇인지 잘 모르겠는 데이터들로 가득하지만,
m_InternalIds를 보면 번들의 위치 (모자이크 된 부분은 서버 주소다),
m_KeyDataString 안에는 우리가 설정한 키값들과 정보들이 들어가 있는데 궁금하시다면 Base64 디코딩 해보면 안에 있는 정보를 볼 수 있다.
다운 받기
일단 서버에 원격 카탈로그,해쉬파일,번들 파일을 올렸다는 가정하에 시작한다.
난 aws의 s3를 사용했는데, 잘 정리된 블로그들이 많으니 참고하면 좋을 것 같다.
내 버킷 / Android 경로에 파일들을 넣어주었다.
public async UniTask AddressableTestAsync()
{
await Addressables.InitializeAsync();
var downLoadSize = await Addressables.GetDownloadSizeAsync(label);
Debug.Log($"다운로드 사이즈 :{downLoadSize} bytes");
if(downLoadSize > 0)
{
var handle = Addressables.DownloadDependenciesAsync(label);
while(!handle.IsDone)
{
var downStatus = handle.GetDownloadStatus();
Debug.Log($"{downStatus.DownloadedBytes}/{downStatus.TotalBytes}");
Debug.Log($"{downStatus.Percent * 100f} %");
await UniTask.Yield();
}
if(handle.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
{
//성공
}
else
{
//실패
}
Addressables.Release(handle);
}
}
다운로드 함수에는 UniTask 라이브러리를 써서 편하게 비동기로 작업했다.
코루틴을 사용해도 된다.
초기화
await Addressables.InitializeAsync();
처음으로 어드레서블 초기화를 해주었다.
초기화에서는 원격 카탈로그가 없으면 다운받고, 만약 다운받은 카탈로그가 있다면 이전에 다운받았던 hash값이랑 서버에 있는 hash값이랑 비교해서 hash값이 다르면 서버에 있는것을 최신으로 판단하고 다운받는다.
정확한 초기화 작업은 아래 링크에서 확인이 가능하다.
https://docs.unity3d.com/kr/Packages/com.unity.addressables%401.21/manual/InitializeAsync.html
다운로드 사이즈 체크
var downLoadSize = await Addressables.GetDownloadSizeAsync(label);
Debug.Log($"다운로드 사이즈 :{downLoadSize} bytes");
일반적으로 어드레서블의 LoadAsset이나 InstantiateAsync를 이용해서 원격에 있는 리소스를 접근하려고 하면 자동으로 다운을 받아서 로드하거나 생성하지만, 일반적으로는 유저가 다운받을 시간을 주기 때문에 미리 체크하도록 구현했다.
그리고 다른 설정 없이 그룹별로 다운로드가 되면 너무 좋지만, 일반적으로는 라벨을 통해 접근한다.
그래서 라벨을 다 붙여놓고 특정 라벨만 다운받게 하거나, 전체 번들을 받고싶을땐 All 라벨을 추가적으로 붙여줘서 다운받게 했다.
그룹별로 다운이 안되는것이 좀 불편했다.
다운로드
if(downLoadSize > 0)
{
var handle = Addressables.DownloadDependenciesAsync(label);
while(!handle.IsDone)
{
var downStatus = handle.GetDownloadStatus();
Debug.Log($"{downStatus.DownloadedBytes}/{downStatus.TotalBytes}");
Debug.Log($"{downStatus.Percent * 100f} %");
await UniTask.Yield();
}
Addressables.Release(handle);
}
다운 받아야하는것이 있다면 다운을 해주었다.
다운 용량 체크와 똑같이 다운로드 함수도 라벨을 이용하면 된다.
await 를 이용해서 다운로드가 완료될때까지 기다려도 되지만, 보통은 UI로 유저들에게 알려주어야 하기때문에 이런식으로 구현했다.
다운로드 핸들의 GetDownloadStatus 함수를 쓰면 DownloadStatus라는 구조체 안에 변수들로 편하게 사용이 가능하다.
마지막에 핸들 Release는 필수다.
하지 않으면 어드레서블을 로드하려고 할때 에러가 난다.
이런식으로 다운이 완료되었다.
겪었던 문제들
crc mismatch
어드레서블 그룹 설정에 가보면 Asset Bundle CRC라는것이 있다.
번들의 파일 상태가 올바른지 확인하는 것이라는데 처음에는 계속 crc mismatch라는 에러가 뜨길래 이 설정 문제인듯 했으나..
이것저것 하다보니 알게된것은 내가 aws의 클라우드 프론트를 처음 써봐서 겪은 문제였다.
그룹 설정에는 Bundle Naming Mode 라는 것이 있는데,
Filename으로 설정하면 해쉬값없이 그룹 이름으로만 깔끔하게 번들을 뽑아준다.
처음에는 이 설정으로 테스트를 진행했었다.
s3에 계속 똑같은 파일 이름으로 업로드를 하니 CDN 서버에 캐싱된 이전에 올렸던 파일들이 다운받아졌고 그것이 crc mismatch 오류를 일으켰다.
해시값을 붙여서 계속 파일명을 바꿔서 업로드하거나, 아니면 Invalidation(무효화) 를 꼭 해야한다.
게임 빌드 컴퓨터와 어드레서블 빌드 컴퓨터가 다를때의 오류
하루는 작업하는 컴퓨터에서 어드레서블을 빌드하고, 빌드 컴퓨터로 게임 빌드를 했다.
어드레서블을 불러오는데 오류가나서 로그를 보니 번들명이 예전 번들명이였다.
다시 한 컴퓨터로 게임,어드레서블 빌드를 다 하니 오류가 나지 않았다.
그래서 아래와 같은 테스트를 해보았다.
PC용 빌드를 해보면 StreamingAssets 폴더에 라이브러리에 있던 로컬 카탈로그와 번들이 똑같이 존재한다.
안드로이드 빌드를 하고 , 확장자를 zip으로 바꿔서 내부를 들여다보면 assets - aa 폴더에 라이브러리에 있던 로컬 카탈로그와 번들이 똑같이 존재한다.
그렇다면 빌드를 할때 우리의 라이브러리 폴더에 있는 카탈로그와 번들이 똑같이 들어가는 것일까?
라이브러리 폴더안에 있는 카탈로그에 이상한 문구를 써서 빌드를 하고,
다시 확인해보니 라이브러리에 있는 카탈로그와 번들이 똑같이 빌드에 포함되는것을 확인했다.
결과:
어드레서블 빌드를 따로 두고 싶다면 라이브러리 / com.unity.addressables 폴더만 동기화 시켜주면 된다.
보통은 라이브러리 폴더가 다 예외처리가 되어있어서 깃에 업로드가 되지 않기 때문에 나같은 경우는 깃이그노어에서 com.unity.addressables폴더와 그 하위에 있는 파일들을 전부 예외처리 해주었다.
최종적으로는 젠킨스를 이용해
깃 체크아웃 - 어드레서블 빌드 - 로컬 카탈로그 및 번들 커밋 & 푸시 - s3 upload 와 같은 자동 배포를 구축해두었다.
시행착오가 많긴했지만 그래도 끝내서 후련하다.
다음에는 번들 업데이트에 대해 써볼 예정이다.
'게임 엔진 > Unity' 카테고리의 다른 글
[어드레서블] - 기본 및 사용법 (0) | 2024.08.07 |
---|---|
Jenkins로 유니티 빌드 자동화 (0) | 2024.05.09 |
Unity 라이브러리 추천 - RestClient (0) | 2024.03.24 |
Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 3편 (1) | 2024.03.23 |
Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 2편 (0) | 2024.03.23 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!