콘텐츠로 이동

Unity Addressable Remote CDN 패턴

Addressables의 Remote Load Path를 CDN URL로 설정하면 앱 업데이트 없이 에셋을 교체할 수 있습니다.

빌드 서버 → 에셋 번들 + 카탈로그 → CDN (S3, CloudFront 등)
클라이언트 앱 → 카탈로그 체크 → 변경된 번들만 다운로드 → 로드

Window → Asset Management → Addressables → Groups에서:

  • Build Path: [BuildScriptPackedMode.BuildPath]
  • Load Path: https://cdn.example.com/[BuildTarget]/[version]/
  • Bundle Mode: Pack Together By Label (카테고리별 번들 분리 권장)
Remote_Characters (Label: characters)
Remote_Maps (Label: maps)
Remote_UI (Label: ui)
public class AssetManager : MonoBehaviour {
async void Start() {
// 1. Addressables 초기화
await Addressables.InitializeAsync().Task;
// 2. 업데이트된 카탈로그 확인
var checkHandle = Addressables.CheckForCatalogUpdates(autoReleaseHandle: false);
var catalogs = await checkHandle.Task;
if (catalogs.Count > 0) {
// 3. 카탈로그 업데이트 적용
var updateHandle = Addressables.UpdateCatalogs(catalogs, autoReleaseHandle: false);
await updateHandle.Task;
Addressables.Release(updateHandle);
}
Addressables.Release(checkHandle);
// 4. 필요한 에셋 다운로드
await DownloadDependencies("maps");
}
}

의존성 다운로드와 진행률 표시

섹션 제목: “의존성 다운로드와 진행률 표시”
async Task DownloadDependencies(string label) {
// 다운로드 크기 확인
var sizeHandle = Addressables.GetDownloadSizeAsync(label);
long size = await sizeHandle.Task;
Addressables.Release(sizeHandle);
if (size == 0) return; // 이미 캐시됨
Debug.Log($"다운로드 크기: {size / 1024f / 1024f:F1} MB");
// 다운로드 시작
var dlHandle = Addressables.DownloadDependenciesAsync(label, autoReleaseHandle: false);
while (!dlHandle.IsDone) {
float progress = dlHandle.PercentComplete;
progressBar.value = progress;
await Task.Yield();
}
Addressables.Release(dlHandle);
}
// 로드 후 명시적 해제 필요
async Task<GameObject> LoadCharacter(string key) {
var handle = Addressables.LoadAssetAsync<GameObject>(key);
var prefab = await handle.Task;
// handle은 unload 시까지 보관
_handles[key] = handle;
return prefab;
}
void Unload(string key) {
if (_handles.TryGetValue(key, out var handle)) {
Addressables.Release(handle);
_handles.Remove(key);
}
}
cdn.example.com/
Android/
v1.0.0/ ← 구버전 클라이언트용
catalog.json
characters.bundle
v1.1.0/ ← 신버전 클라이언트용
catalog.json
characters.bundle (업데이트됨)

Remote Load Path에 앱 버전을 포함시켜 구버전 클라이언트가 잘못된 번들을 받지 않도록 합니다.

// Addressables Profile Variable
[Remote Load Path]
https://cdn.example.com/[BuildTarget]/[UnityEditor.PlayerSettings.bundleVersion]/

개발 중에는 실제 CDN 없이 로컬 번들을 사용할 수 있습니다.

  • Play Mode Script: Use Existing Build → 실제 빌드된 번들 사용
  • Play Mode Script: Simulate Groups → 번들 없이 에셋 직접 로드
  • Remote Load Path를 CDN URL로 설정해 앱 업데이트 없이 에셋 교체
  • CheckForCatalogUpdatesUpdateCatalogsDownloadDependenciesAsync 순서로 업데이트
  • GetDownloadSizeAsync로 미리 크기 확인 후 사용자에게 동의 요청
  • Load Path에 앱 버전 포함으로 구버전 클라이언트 보호
  • 로드 핸들은 반드시 명시적으로 Release 호출