런타임에 카탈로그 관리
기본적으로 어드레서블 시스템은 런타임에 카탈로그를 자동으로 관리합니다. 원격 카탈로그를 사용하여 애플리케이션을 빌드한 경우 어드레서블 시스템은 자동으로 새 카탈로그를 확인하고 새 버전을 다운로드하여 메모리에 로드합니다.
런타임에 추가 카탈로그를 로드할 수 있습니다. 예를 들어 호환되는 별도의 프로젝트에서 생성한 카탈로그를 로드하여 해당 프로젝트에서 빌드한 어드레서블 에셋을 로드할 수 있습니다. 자세한 내용은 여러 프로젝트에서 콘텐츠 로드를 참조하십시오.
어드레서블 시스템의 기본 카탈로그 업데이트 동작을 변경하려면 자동 확인을 비활성화하고 업데이트를 수동으로 확인할 수 있습니다. 자세한 내용은 카탈로그 업데이트를 참조하십시오.
추가 카탈로그 로드
Addressables.LoadContentCatalogAsync
를 사용하여 호스팅 서비스 또는 로컬 파일 시스템에서 추가 콘텐츠 카탈로그를 로드할 수 있습니다. 로드하려는 카탈로그의 위치를 제공해야 합니다. 카탈로그 로드 작업이 완료되면 새 카탈로그의 키를 사용하여 모든 어드레서블 로드 함수를 호출할 수 있습니다.
카탈로그와 동일한 URL에 카탈로그 해시 파일을 제공하면 어드레서블은 보조 카탈로그를 캐시합니다. 클라이언트 애플리케이션이 카탈로그를 로드할 경우 해시가 변경된 경우에만 카탈로그의 새 버전을 다운로드합니다.
해시 파일은 카탈로그와 동일한 위치에 있어야 하며 이름도 카탈로그와 같아야 합니다. 경로의 유일한 차이점은 확장자뿐이어야 합니다.
LoadContentCatalogAsync
에는 autoReleaseHandle
파라미터가 함께 제공됩니다. 시스템이 새 원격 카탈로그를 다운로드하려면 로드하려는 카탈로그에 연결되는 LoadContentCatalogAsync
에 대한 모든 이전 호출을 해제해야 합니다. 그렇지 않으면 시스템이 작업 캐시에서 콘텐츠 카탈로그 로드 작업을 선택합니다. 캐시된 작업이 선택되면 새 원격 카탈로그는 다운로드되지 않습니다. true로 설정하면 파라미터 autoReleaseHandle
은 작업이 완료된 후 작업 캐시에 남아 있지 않도록 합니다.
카탈로그를 로드한 후에는 언로드할 수 없습니다. 그러나 로드된 카탈로그를 업데이트할 수는 있습니다. 카탈로그를 업데이트하기 전에 카탈로그를 로드한 작업에 대한 작업 핸들을 해제해야 합니다. 자세한 내용은 카탈로그 업데이트를 참조하십시오.
일반적으로 카탈로그를 로드한 후에는 작업 핸들을 유지할 이유가 없습니다. 다음 예제와 같이 카탈로그를 로드할 때 autoReleaseHandle
파라미터를 true로 설정하면 자동으로 해제할 수 있습니다.
public IEnumerator Start()
{
//Load a catalog and automatically release the operation handle.
AsyncOperationHandle<IResourceLocator> handle
= Addressables.LoadContentCatalogAsync("path_to_secondary_catalog", true);
yield return handle;
//...
}
[!팁] 어드레서블 설정에서 Catalog Download Timeout 프로퍼티를 사용하면 카탈로그 다운로드를 위한 타임아웃을 지정할 수 있습니다.
카탈로그 업데이트
카탈로그 해시 파일을 사용할 수 있는 경우, 어드레서블은 카탈로그를 로드할 때 해시를 검사하여 제공된 URL의 버전이 캐시된 카탈로그 버전보다 최신 버전인지 확인합니다. 기본 카탈로그 확인을 비활성화할 수 있으며, 카탈로그를 업데이트하려면 Addressables.UpdateCatalogs
메서드를 호출할 수 있습니다. LoadContentCatalogAsync
를 사용하여 수동으로 카탈로그를 로드한 경우, 작업 핸들을 해제해야 카탈로그를 업데이트할 수 있습니다.
UpdateCatalog
메서드를 호출하면 Unity는 작업이 완료될 때까지 다른 모든 어드레서블 요청을 차단합니다. 작업이 완료된 후 UpdateCatalog
가 반환하는 작업 핸들을 즉시 해제하거나 autoRelease
파라미터를 true
로 설정할 수 있습니다.
카탈로그 목록을 제공하지 않고 UpdateCatalog
를 호출하면 어드레서블은 로드된 모든 카탈로그에 업데이트가 있는지 확인합니다.
IEnumerator UpdateCatalogs()
{
AsyncOperationHandle<List<IResourceLocator>> updateHandle
= Addressables.UpdateCatalogs();
yield return updateHandle;
Addressables.Release(updateHandle);
}
또한 Addressables.CheckForCatalogUpdates
를 직접 호출하여 업데이트가 있는 카탈로그의 목록을 가져오고 업데이트를 수행할 수 있습니다.
IEnumerator CheckCatalogs()
{
List<string> catalogsToUpdate = new List<string>();
AsyncOperationHandle<List<string>> checkForUpdateHandle
= Addressables.CheckForCatalogUpdates();
checkForUpdateHandle.Completed += op => { catalogsToUpdate.AddRange(op.Result); };
yield return checkForUpdateHandle;
if (catalogsToUpdate.Count > 0)
{
AsyncOperationHandle<List<IResourceLocator>> updateHandle
= Addressables.UpdateCatalogs(catalogsToUpdate);
yield return updateHandle;
Addressables.Release(updateHandle);
}
Addressables.Release(checkForUpdateHandle);
}
[!중요] 관련 에셋 번들에서 콘텐츠를 이미 로드한 상태에서 카탈로그를 업데이트하면 로드된 에셋 번들과 업데이트된 버전 간에 충돌이 발생할 수 있습니다. 어드레서블 설정에서 Unique Bundle Ids 옵션을 활성화하여 런타임에 번들 ID 충돌이 발생할 가능성을 차단하십시오. 이 옵션을 활성화하면 콘텐츠 업데이트를 수행할 때 일반적으로 더 많은 에셋 번들을 다시 빌드해야 합니다. 자세한 내용은 콘텐츠 업데이트 빌드를 참조하십시오. 업데이트해야 하는 모든 콘텐츠와 에셋 번들을 언로드할 수도 있으나, 이 경우 작업이 느려질 수 있습니다.