protected override List <ContentCatalogBuildInfo> GetContentCatalogs(AddressablesDataBuilderInput builderInput, AddressableAssetsBuildContext aaContext) { // cleanup catalogSetups.Clear(); // Prepare catalogs var defaultCatalog = new ContentCatalogBuildInfo(ResourceManagerRuntimeData.kCatalogAddress, builderInput.RuntimeCatalogFilename); foreach (ExternalCatalogSetup catalogContentGroup in externalCatalogs) { if (catalogContentGroup != null) { catalogSetups.Add(new CatalogSetup(catalogContentGroup)); } } // Assign assets to new catalogs based on included groups var profileSettings = aaContext.Settings.profileSettings; var profileId = aaContext.Settings.activeProfileId; foreach (var loc in aaContext.locations) { CatalogSetup preferredCatalog = catalogSetups.FirstOrDefault(cs => cs.CatalogContentGroup.IsPartOfCatalog(loc, aaContext)); if (preferredCatalog != null) { if (loc.ResourceType == typeof(IAssetBundleResource)) { string filePath = Path.GetFullPath(loc.InternalId.Replace("{UnityEngine.AddressableAssets.Addressables.RuntimePath}", Addressables.BuildPath)); string runtimeLoadPath = preferredCatalog.CatalogContentGroup.RuntimeLoadPath + "/" + Path.GetFileName(filePath); runtimeLoadPath = profileSettings.EvaluateString(profileId, runtimeLoadPath); preferredCatalog.Files.Add(filePath); preferredCatalog.BuildInfo.Locations.Add(new ContentCatalogDataEntry(typeof(IAssetBundleResource), runtimeLoadPath, loc.Provider, loc.Keys, loc.Dependencies, loc.Data)); } else { preferredCatalog.BuildInfo.Locations.Add(loc); } } else { defaultCatalog.Locations.Add(loc); } } // Process dependencies foreach (CatalogSetup additionalCatalog in catalogSetups) { var dataEntries = new Queue <ContentCatalogDataEntry>(additionalCatalog.BuildInfo.Locations); var processedEntries = new HashSet <ContentCatalogDataEntry>(); while (dataEntries.Count > 0) { ContentCatalogDataEntry dataEntry = dataEntries.Dequeue(); if (!processedEntries.Add(dataEntry) || (dataEntry.Dependencies == null) || (dataEntry.Dependencies.Count == 0)) { continue; } foreach (var entryDependency in dataEntry.Dependencies) { // Search for the dependencies in the default catalog only. var depLocation = defaultCatalog.Locations.Find(loc => loc.Keys[0] == entryDependency); if (depLocation != null) { dataEntries.Enqueue(depLocation); // If the dependency wasn't part of the catalog yet, add it. if (!additionalCatalog.BuildInfo.Locations.Contains(depLocation)) { additionalCatalog.BuildInfo.Locations.Add(depLocation); } } else if (!additionalCatalog.BuildInfo.Locations.Exists(loc => loc.Keys[0] == entryDependency)) { Debug.LogErrorFormat("Could not find location for dependency ID {0} in the default catalog.", entryDependency); } } } } // Gather catalogs var catalogs = new List <ContentCatalogBuildInfo>(catalogSetups.Count + 1); catalogs.Add(defaultCatalog); foreach (var setup in catalogSetups) { if (!setup.Empty) { catalogs.Add(setup.BuildInfo); } } return(catalogs); }
public CatalogSetup(ExternalCatalogSetup buildCatalog) { this.CatalogContentGroup = buildCatalog; BuildInfo = new ContentCatalogBuildInfo(buildCatalog.CatalogName, buildCatalog.CatalogName + ".json"); BuildInfo.Register = false; }