public void AddPostCatalogUpdates_AddsCallbackToUpdateBundleLocation_WhenNamingSchemaIsSetToFilenameOnly() { //Setup AddressableAssetGroup group = Settings.CreateGroup("TestAddPostCatalogUpdate", false, false, false, new List <AddressableAssetGroupSchema>(), typeof(BundledAssetGroupSchema)); group.GetSchema <BundledAssetGroupSchema>().BundleNaming = BundledAssetGroupSchema.BundleNamingStyle.NoHash; List <Action> callbacks = new List <Action>(); string targetBundlePathHashed = "LocalPathToFile/testbundle_123456.bundle"; string targetBundlePathUnHashed = "LocalPathToFile/testbundle.bundle"; string targetBundleInternalIdHashed = "{runtime_val}/testbundle_123456.bundle"; string targetBundleInternalIdUnHashed = "{runtime_val}/testbundle.bundle"; ContentCatalogDataEntry dataEntry = new ContentCatalogDataEntry(typeof(ContentCatalogData), targetBundleInternalIdHashed, typeof(BundledAssetProvider).FullName, new List <object>()); FileRegistry registry = new FileRegistry(); registry.AddFile(targetBundlePathHashed); m_BuildScript.AddPostCatalogUpdatesInternal(group, callbacks, dataEntry, targetBundlePathHashed, registry); //Assert setup Assert.AreEqual(1, callbacks.Count); Assert.AreEqual(targetBundleInternalIdHashed, dataEntry.InternalId); //Test callbacks[0].Invoke(); //Assert Assert.AreEqual(targetBundleInternalIdUnHashed, dataEntry.InternalId); Assert.AreEqual(registry.GetFilePathForBundle("testbundle"), targetBundlePathUnHashed); //Cleanup Settings.RemoveGroup(group); }
static void PostProcessBundles(AddressableAssetGroup assetGroup, List <string> bundles, IBundleBuildResults buildResult, IWriteData writeData, ResourceManagerRuntimeData runtimeData, List <ContentCatalogDataEntry> locations, FileRegistry registry) { var schema = assetGroup.GetSchema <BundledAssetGroupSchema>(); if (schema == null) { return; } var path = schema.BuildPath.GetValue(assetGroup.Settings); if (string.IsNullOrEmpty(path)) { return; } foreach (var originalBundleName in bundles) { var newBundleName = originalBundleName; var info = buildResult.BundleInfos[newBundleName]; ContentCatalogDataEntry dataEntry = locations.FirstOrDefault(s => newBundleName == (string)s.Keys[0]); if (dataEntry != null) { var requestOptions = new AssetBundleRequestOptions { Crc = schema.UseAssetBundleCrc ? info.Crc : 0, Hash = schema.UseAssetBundleCache ? info.Hash.ToString() : "", ChunkedTransfer = schema.ChunkedTransfer, RedirectLimit = schema.RedirectLimit, RetryCount = schema.RetryCount, Timeout = schema.Timeout, BundleName = Path.GetFileName(info.FileName), BundleSize = GetFileSize(info.FileName) }; dataEntry.Data = requestOptions; dataEntry.InternalId = BuildUtility.GetNameWithHashNaming(schema.BundleNaming, info.Hash.ToString(), dataEntry.InternalId); newBundleName = BuildUtility.GetNameWithHashNaming(schema.BundleNaming, info.Hash.ToString(), newBundleName); } else { Debug.LogWarningFormat("Unable to find ContentCatalogDataEntry for bundle {0}.", newBundleName); } var targetPath = Path.Combine(path, newBundleName); if (!Directory.Exists(Path.GetDirectoryName(targetPath))) { Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); } File.Copy(Path.Combine(assetGroup.Settings.buildSettings.bundleBuildPath, originalBundleName), targetPath, true); registry.AddFile(targetPath); } }
/// <summary> /// Utility method to write a file. The directory will be created if it does not exist. /// </summary> /// <param name="path">The path of the file to write.</param> /// <param name="content">The content of the file.</param> /// <param name="registry">The file registry used to track all produced artifacts.</param> /// <returns>True if the file was written.</returns> protected static bool WriteFile(string path, string content, FileRegistry registry) { try { registry.AddFile(path); var dir = Path.GetDirectoryName(path); if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) { Directory.CreateDirectory(dir); } File.WriteAllText(path, content); return(true); } catch (Exception ex) { Debug.LogException(ex); registry.RemoveFile(path); return(false); } }
void PostProcessBundles(AddressableAssetGroup assetGroup, List <string> buildBundles, List <string> outputBundles, IBundleBuildResults buildResult, IWriteData writeData, ResourceManagerRuntimeData runtimeData, List <ContentCatalogDataEntry> locations, FileRegistry registry, Dictionary <string, ContentCatalogDataEntry> primaryKeyToCatalogEntry) { var schema = assetGroup.GetSchema <BundledAssetGroupSchema>(); if (schema == null) { return; } var path = schema.BuildPath.GetValue(assetGroup.Settings); if (string.IsNullOrEmpty(path)) { return; } for (int i = 0; i < buildBundles.Count; ++i) { if (primaryKeyToCatalogEntry.TryGetValue(buildBundles[i], out ContentCatalogDataEntry dataEntry)) { var info = buildResult.BundleInfos[buildBundles[i]]; var requestOptions = new AssetBundleRequestOptions { Crc = schema.UseAssetBundleCrc ? info.Crc : 0, Hash = schema.UseAssetBundleCache ? info.Hash.ToString() : "", ChunkedTransfer = schema.ChunkedTransfer, RedirectLimit = schema.RedirectLimit, RetryCount = schema.RetryCount, Timeout = schema.Timeout, BundleName = Path.GetFileName(info.FileName), BundleSize = GetFileSize(info.FileName) }; dataEntry.Data = requestOptions; int extensionLength = Path.GetExtension(outputBundles[i]).Length; string[] deconstructedBundleName = outputBundles[i].Substring(0, outputBundles[i].Length - extensionLength).Split('_'); string reconstructedBundleName = string.Join("_", deconstructedBundleName, 1, deconstructedBundleName.Length - 1) + ".bundle"; outputBundles[i] = ConstructAssetBundleName(assetGroup, schema, info, reconstructedBundleName); dataEntry.InternalId = dataEntry.InternalId.Remove(dataEntry.InternalId.Length - buildBundles[i].Length) + outputBundles[i]; dataEntry.Keys[0] = outputBundles[i]; ReplaceDependencyKeys(buildBundles[i], outputBundles[i], locations); if (!m_BundleToInternalId.ContainsKey(buildBundles[i])) { m_BundleToInternalId.Add(buildBundles[i], dataEntry.InternalId); } if (dataEntry.InternalId.StartsWith("http:\\")) { dataEntry.InternalId = dataEntry.InternalId.Replace("http:\\", "http://").Replace("\\", "/"); } if (dataEntry.InternalId.StartsWith("https:\\")) { dataEntry.InternalId = dataEntry.InternalId.Replace("https:\\", "https://").Replace("\\", "/"); } } else { Debug.LogWarningFormat("Unable to find ContentCatalogDataEntry for bundle {0}.", outputBundles[i]); } var targetPath = Path.Combine(path, outputBundles[i]); if (!Directory.Exists(Path.GetDirectoryName(targetPath))) { Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); } File.Copy(Path.Combine(assetGroup.Settings.buildSettings.bundleBuildPath, buildBundles[i]), targetPath, true); registry.AddFile(targetPath); } }
static void PostProcessBundles(AddressableAssetGroup assetGroup, List <string> bundles, IBundleBuildResults buildResult, IWriteData writeData, ResourceManagerRuntimeData runtimeData, List <ContentCatalogDataEntry> locations, FileRegistry registry) { var schema = assetGroup.GetSchema <BundledAssetGroupSchema>(); if (schema == null) { return; } var path = schema.BuildPath.GetValue(assetGroup.Settings); if (string.IsNullOrEmpty(path)) { return; } foreach (var originalBundleName in bundles) { var newBundleName = originalBundleName; var info = buildResult.BundleInfos[newBundleName]; ContentCatalogDataEntry dataEntry = locations.FirstOrDefault(s => newBundleName == (string)s.Keys[0]); if (dataEntry != null) { var requestOptions = new AssetBundleRequestOptions { Crc = schema.UseAssetBundleCrc ? info.Crc : 0, Hash = schema.UseAssetBundleCache ? info.Hash.ToString() : "", ChunkedTransfer = schema.ChunkedTransfer, RedirectLimit = schema.RedirectLimit, RetryCount = schema.RetryCount, Timeout = schema.Timeout, BundleName = Path.GetFileName(info.FileName), BundleSize = GetFileSize(info.FileName) }; dataEntry.Data = requestOptions; int extensionLength = Path.GetExtension(originalBundleName).Length; string[] deconstructedBundleName = originalBundleName.Substring(0, originalBundleName.Length - extensionLength) .Split('_'); deconstructedBundleName[0] = assetGroup.Name .Replace(" ", "") .Replace('\\', '/') .Replace("//", "/") .ToLower(); string reconstructedBundleName = string.Join("_", deconstructedBundleName) + ".bundle"; newBundleName = BuildUtility.GetNameWithHashNaming(schema.BundleNaming, info.Hash.ToString(), reconstructedBundleName); dataEntry.InternalId = dataEntry.InternalId.Remove(dataEntry.InternalId.Length - originalBundleName.Length) + newBundleName; if (dataEntry.InternalId.StartsWith("http:\\")) { dataEntry.InternalId = dataEntry.InternalId.Replace("http:\\", "http://").Replace("\\", "/"); } } else { Debug.LogWarningFormat("Unable to find ContentCatalogDataEntry for bundle {0}.", newBundleName); } var targetPath = Path.Combine(path, newBundleName); if (!Directory.Exists(Path.GetDirectoryName(targetPath))) { Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); } File.Copy(Path.Combine(assetGroup.Settings.buildSettings.bundleBuildPath, originalBundleName), targetPath, true); registry.AddFile(targetPath); } }
public override void PostProcessBundles(AddressableAssetGroup assetGroup, List <string> buildBundles, List <string> outputBundles, IBundleBuildResults buildResult, ResourceManagerRuntimeData runtimeData, List <ContentCatalogDataEntry> locations, FileRegistry registry, Dictionary <string, ContentCatalogDataEntry> primaryKeyToCatalogEntry, Dictionary <string, string> bundleRenameMap, List <Action> postCatalogUpdateCallbacks) { var schema = assetGroup.GetSchema <BundledAssetGroupSchema>(); if (schema == null) { return; } var path = schema.BuildPath.GetValue(assetGroup.Settings); if (string.IsNullOrEmpty(path)) { return; } for (int i = 0; i < buildBundles.Count; ++i) { if (primaryKeyToCatalogEntry.TryGetValue(buildBundles[i], out ContentCatalogDataEntry dataEntry)) { var info = buildResult.BundleInfos[buildBundles[i]]; var requestOptions = new AssetBundleEncryptRequestOptions { Crc = schema.UseAssetBundleCrc ? info.Crc : 0, UseCrcForCachedBundle = schema.UseAssetBundleCrcForCachedBundles, Hash = schema.UseAssetBundleCache ? info.Hash.ToString() : "", ChunkedTransfer = schema.ChunkedTransfer, RedirectLimit = schema.RedirectLimit, RetryCount = schema.RetryCount, Timeout = schema.Timeout, BundleName = Path.GetFileName(info.FileName), BundleSize = GetFileSize(info.FileName) }; dataEntry.Data = requestOptions; int extensionLength = Path.GetExtension(outputBundles[i]).Length; string[] deconstructedBundleName = outputBundles[i].Substring(0, outputBundles[i].Length - extensionLength).Split('_'); string reconstructedBundleName = string.Join("_", deconstructedBundleName, 1, deconstructedBundleName.Length - 1) + ".bundle"; outputBundles[i] = ConstructAssetBundleName(assetGroup, schema, info, reconstructedBundleName); dataEntry.InternalId = dataEntry.InternalId.Remove(dataEntry.InternalId.Length - buildBundles[i].Length) + outputBundles[i]; dataEntry.Keys[0] = outputBundles[i]; ReplaceDependencyKeys(buildBundles[i], outputBundles[i], locations); Debug.Log(outputBundles[i] + "crc = " + requestOptions.Crc + " hash = " + requestOptions.Hash); if (!m_BundleToInternalId.ContainsKey(buildBundles[i])) { m_BundleToInternalId.Add(buildBundles[i], dataEntry.InternalId); } if (dataEntry.InternalId.StartsWith("http:\\")) { dataEntry.InternalId = dataEntry.InternalId.Replace("http:\\", "http://").Replace("\\", "/"); } if (dataEntry.InternalId.StartsWith("https:\\")) { dataEntry.InternalId = dataEntry.InternalId.Replace("https:\\", "https://").Replace("\\", "/"); } dataEntry.InternalId = CheckNameNeedStripped(assetGroup, dataEntry.InternalId); } else { Debug.LogWarningFormat("Unable to find ContentCatalogDataEntry for bundle {0}.", outputBundles[i]); } //获取bundle的保存路径 var targetPath = Path.Combine(path, outputBundles[i]); //判断目录是否存在 if (!Directory.Exists(Path.GetDirectoryName(targetPath))) { Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); } File.Copy(Path.Combine(assetGroup.Settings.buildSettings.bundleBuildPath, buildBundles[i]), targetPath, true); var nameWithourHash = CheckNameNeedStripped(assetGroup, outputBundles[i]); EncodeAssetBundleBySetOffset(nameWithourHash, targetPath); var bundleName = Path.GetFileName(nameWithourHash); if (IsBuildInAssetBundle(bundleName)) { string RuntimePath = UnityEngine.AddressableAssets.Addressables.RuntimePath; string destPath = Path.Combine(System.Environment.CurrentDirectory, RuntimePath, PlatformMappingService.GetPlatform().ToString(), nameWithourHash); if (!Directory.Exists(Path.GetDirectoryName(destPath))) { Directory.CreateDirectory(Path.GetDirectoryName(destPath)); } if (!File.Exists(destPath)) { File.Copy(targetPath, destPath); } } AddPostCatalogUpdatesInternal(assetGroup, postCatalogUpdateCallbacks, dataEntry, targetPath); registry.AddFile(targetPath); } }