# 4. Discovery, Trust, and Updates Part of [[Modding with Addressables]]. Prev: [[3. LoadContentCatalogAsync]]. Next: [[5. Worked Example Cosmetic Pack]]. ## 4.1 Where the path comes from A classroom pack path should be **yours**: - An HTTPS URL on a server the class controls (or CCD, if you follow current CCD docs — the Addressables series did not stand up a live bucket). - A file next to the player, or a path the user picked from a **known folder**. Prefer **HTTPS**. Player Settings already has an "Allow downloads over HTTP" policy on several platforms; do not casually set it to Always Allowed to "make mods work." Do not treat an arbitrary pasted URL as a completed feature. A catalog and its bundles can include large payloads and unexpected assets. This course still cannot execute *new* C# from the pack, but a huge download or a confusing prefab is enough to ruin a session. ## 4.2 Failed loads are normal Show a retry, continue without the pack, and do not block the bootstrap scene. The existing remote-content advice in [[5. Scenes Catalogs and Remote Content]] still holds: optional cosmetics, not the first gameplay door, on a first lab. ## 4.3 Updating catalogs (official) If a hash file is available, Unity checks it when loading. You can disable automatic checks with the official **Only update catalogs manually** setting and call the official APIs (2.9.1 manage-catalogs manual). Official sample names: ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceLocations; IEnumerator CheckCatalogs() { var checkForUpdateHandle = Addressables.CheckForCatalogUpdates(); yield return checkForUpdateHandle; List<string> catalogsToUpdate = new List<string>(); if (checkForUpdateHandle.Status == AsyncOperationStatus.Succeeded) catalogsToUpdate.AddRange(checkForUpdateHandle.Result); if (catalogsToUpdate.Count > 0) { var updateHandle = Addressables.UpdateCatalogs(catalogsToUpdate); yield return updateHandle; updateHandle.Release(); } checkForUpdateHandle.Release(); } ``` Or `Addressables.UpdateCatalogs()` with no list — official: checks **all** loaded catalogs. Official: `UpdateCatalogs` **blocks other Addressable requests** until it finishes. Release its handle (or pass the official auto-release parameter if you use that overload — confirm in 2.9.1 IntelliSense). If you loaded a catalog with `LoadContentCatalogAsync`, **release that handle** before updating (part 3). That is why `autoReleaseHandle: true` matters. ### Already-loaded bundles Official important note: updating a catalog while related AssetBundles are **already loaded** can conflict. Official mitigations: enable **Unique Bundle IDs** in Addressable settings (more bundles to rebuild on a content update), or unload content that must be updated (can be slow). Read [[6. Content Builds Updates and CI]] before you turn Unique Bundle IDs on in a Quest lab. ## 4.4 Exercise Write the player-facing copy for "cosmetic pack failed to load" and "a newer pack is available." Implement the failure path for a deliberately wrong catalog path. Do not call `UpdateCatalogs` in `Update`. ## Sources - https://docs.unity3d.com/Packages/[email protected]/manual/LoadContentCatalogAsync.html