public static async Task BuildAssetInfoManifestPackage(string exportPath, string assetBundlePath, string aesKey, string aesIv) { var assetInfo = AssetInfoManifest.GetManifestAssetInfo(); var cryptoKey = new AesCryptoStreamKey(aesKey, aesIv); var task = CreateBuildTask(exportPath, assetBundlePath, assetInfo, true, cryptoKey); await task; }
public static async Task BuildAllAssetBundlePackage(string exportPath, string assetBundlePath, AssetInfo[] assetInfos, AssetInfo[] updatedAssetInfos, string aesKey, string aesIv) { var isBatchMode = Application.isBatchMode; var cryptoKey = new AesCryptoStreamKey(aesKey, aesIv); using (new DisableStackTraceScope(LogType.Log)) { var count = 0; var logBuilder = new StringBuilder(); var chunkedAssetInfos = assetInfos.Chunk(25); foreach (var infos in chunkedAssetInfos) { var tasks = new List <Task>(); foreach (var info in infos) { var assetInfo = info; if (assetInfo == null) { continue; } var createPackage = updatedAssetInfos.Contains(assetInfo); var assetBundleName = assetInfo.AssetBundle.AssetBundleName; var buildTask = CreateBuildTask(exportPath, assetBundlePath, assetInfo, createPackage, cryptoKey); var task = Task.Run(async() => { await buildTask; if (isBatchMode) { Debug.LogFormat(assetBundleName); } else { lock (logBuilder) { logBuilder.AppendLine(assetBundleName); count++; if (25 < count) { Debug.Log(logBuilder.ToString()); logBuilder.Clear(); count = 0; } } } }); if (task != null) { tasks.Add(task); } } await Task.WhenAll(tasks); } if (!isBatchMode && count != 0) { Debug.Log(logBuilder.ToString()); } } }
private static Task CreateBuildTask(string exportPath, string assetBundlePath, AssetInfo assetInfo, bool createPackage, AesCryptoStreamKey cryptoKey) { if (assetInfo == null) { return(null); } var task = Task.Run(async() => { try { // アセットバンドルファイルパス. var assetBundleFilePath = PathUtility.Combine(assetBundlePath, assetInfo.AssetBundle.AssetBundleName); if (!File.Exists(assetBundleFilePath)) { throw new FileNotFoundException(assetBundleFilePath); } // 作成するパッケージファイルのパス. var packageFilePath = Path.ChangeExtension(assetBundleFilePath, AssetBundleManager.PackageExtension); // パッケージを作成. if (!File.Exists(packageFilePath) || createPackage) { await CreatePackage(assetBundleFilePath, packageFilePath, cryptoKey); } // 出力先にパッケージファイルをコピー. await ExportPackage(exportPath, assetBundleFilePath, assetInfo); } catch (Exception exception) { Debug.LogException(exception); } }); return(task); }
/// <summary> パッケージファイル化(暗号化). </summary> private static async Task CreatePackage(string assetBundleFilePath, string packageFilePath, AesCryptoStreamKey cryptoKey) { // アセットバンドル読み込み. byte[] data = null; using (var fileStream = new FileStream(assetBundleFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { data = new byte[fileStream.Length]; await fileStream.ReadAsync(data, 0, data.Length); } // 暗号化・書き込み. using (var fileStream = new FileStream(packageFilePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { using (var aesStream = new SeekableCryptoStream(fileStream, cryptoKey)) { aesStream.Write(data, 0, data.Length); } } }
/// <summary> /// 暗号化キー設定. /// Key,IVがModules.ExternalResource.Editor.ManageConfigのAssetのCryptKeyと一致している必要があります. /// </summary> /// <param name="key">暗号化Key(32文字)</param> /// <param name="iv">暗号化IV(16文字)</param> public void SetCryptoKey(string key, string iv) { cryptoKey = new AesCryptoStreamKey(key, iv); }