Unity Addressable Remote CDN 패턴
Remote CDN 구성 개요
섹션 제목: “Remote CDN 구성 개요”Addressables의 Remote Load Path를 CDN URL로 설정하면 앱 업데이트 없이 에셋을 교체할 수 있습니다.
빌드 서버 → 에셋 번들 + 카탈로그 → CDN (S3, CloudFront 등) ↓클라이언트 앱 → 카탈로그 체크 → 변경된 번들만 다운로드 → 로드Addressables 그룹 설정
섹션 제목: “Addressables 그룹 설정”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로 설정해 앱 업데이트 없이 에셋 교체
CheckForCatalogUpdates→UpdateCatalogs→DownloadDependenciesAsync순서로 업데이트GetDownloadSizeAsync로 미리 크기 확인 후 사용자에게 동의 요청- Load Path에 앱 버전 포함으로 구버전 클라이언트 보호
- 로드 핸들은 반드시 명시적으로
Release호출