Beispiel #1
0
        /// <summary> アセットのルートハッシュ情報を書き込み </summary>
        public void SetAssetInfoHash(AssetInfoManifest assetInfoManifest)
        {
            // 文字数が大きくなりすぎないように300ファイル分毎に分割.
            var chunkInfos = assetInfoManifest.GetAssetInfos()
                             .Chunk(300)
                             .ToArray();

            var versionHashBuilder = new StringBuilder();

            foreach (var assetInfos in chunkInfos)
            {
                var hashBuilder = new StringBuilder();

                foreach (var assetInfo in assetInfos)
                {
                    hashBuilder.AppendLine(assetInfo.Hash);
                }

                var hash = hashBuilder.ToString().GetHash();

                versionHashBuilder.AppendLine(hash);
            }

            var versionHash = versionHashBuilder.ToString().GetHash();

            Reflection.SetPrivateField(assetInfoManifest, "versionHash", versionHash);
        }
Beispiel #2
0
        //----- property -----

        //----- method -----

        public override void OnInspectorGUI()
        {
            instance = target as AssetInfoManifest;

            if (!initialized)
            {
                var assetInfos = Reflection.GetPrivateField <AssetInfoManifest, AssetInfo[]>(instance, "assetInfos");

                currentInfos = assetInfos.GroupBy(x => x.Category)
                               .Select(x => new AssetCategoryInfo(x.Key, x.ToArray()))
                               .OrderBy(x => x.Category, new NaturalComparer())
                               .ToArray();

                asstInfoScrollView          = new AsstInfoScrollView();
                asstInfoScrollView.Contents = currentInfos;

                hashGuiStyle = new GUIStyle(EditorStyles.miniBoldLabel)
                {
                    alignment = TextAnchor.MiddleLeft,
                };

                totalAssetCountText = string.Format("Total Asset Count : {0}", assetInfos.Length);

                initialized = true;
            }

            DrawInspector();
        }
Beispiel #3
0
        /// <summary> 未登録のアセットバンドル情報追加 </summary>
        public void AddUnregisteredAssetInfos(AssetInfoManifest assetInfoManifest, BuildResult buildResult)
        {
            var assetBundleAssetInfos = assetInfoManifest.GetAssetInfos()
                                        .Where(x => x.IsAssetBundle)
                                        .GroupBy(x => x.AssetBundle.AssetBundleName)
                                        .ToArray();

            foreach (var bundleInfo in buildResult.BundleBuildResults.BundleInfos)
            {
                var assetBundleName = bundleInfo.Key;

                // マニフェストファイルは登録しない.
                if (AssetInfoManifest.AssetBundleName == assetBundleName)
                {
                    continue;
                }

                // 既に登録済み.
                if (assetBundleAssetInfos.Any(x => x.Key == assetBundleName))
                {
                    continue;
                }

                var fileName = Path.GetFileName(bundleInfo.Value.FileName);

                var assetInfo = new AssetInfo(fileName, "(undefined)", null);

                var assetBundleInfo = new AssetBundleInfo(assetBundleName);

                assetInfo.SetAssetBundleInfo(assetBundleInfo);

                assetInfoManifest.AddAssetInfo(assetInfo);
            }
        }
        public override void OnBegin()
        {
            assetManageManager = null;
            assetInfoManifest  = null;

            changeAssetInfo = false;

            var projectFolders    = ProjectFolders.Instance;
            var assetManageConfig = AssetManageConfig.Instance;

            if (projectFolders != null && assetManageConfig != null)
            {
                assetManageManager = AssetManageManager.Instance;

                externalResourcesPath = projectFolders.ExternalResourcesPath;

                assetManageManager.Initialize(externalResourcesPath, assetManageConfig);

                var manifestPath = PathUtility.Combine(externalResourcesPath, AssetInfoManifest.ManifestFileName);

                assetInfoManifest = AssetDatabase.LoadAssetAtPath <AssetInfoManifest>(manifestPath);

                if (assetInfoManifest != null)
                {
                    assetInfos = Reflection.GetPrivateField <AssetInfoManifest, AssetInfo[]>(assetInfoManifest, "assetInfos");
                }
            }
        }
Beispiel #5
0
        private static void ApplyAssetBundleName(AssetManagement assetManagement, AssetInfoManifest manifest)
        {
            var projectFolders = ProjectFolders.Instance;

            var externalResourcesPath = projectFolders.ExternalResourcesPath;
            var shareResourcesPath    = projectFolders.ShareResourcesPath;

            var assetInfos = manifest.GetAssetInfos().ToArray();

            var count = assetInfos.Length;

            using (new AssetEditingScope())
            {
                for (var i = 0; i < count; i++)
                {
                    var assetInfo = assetInfos[i];

                    var apply = false;

                    if (assetInfo.IsAssetBundle)
                    {
                        var assetPath = ExternalResources.GetAssetPathFromAssetInfo(externalResourcesPath, shareResourcesPath, assetInfo);

                        apply = assetManagement.SetAssetBundleName(assetPath, assetInfo.AssetBundle.AssetBundleName);
                    }

                    if (apply)
                    {
                        EditorUtility.DisplayProgressBar("ApplyAssetBundleName", assetInfo.ResourcePath, (float)i / count);
                    }
                }
            }

            EditorUtility.ClearProgressBar();
        }
Beispiel #6
0
        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;
        }
Beispiel #7
0
        /// <summary> アセットバンドルの参照情報を書き込み </summary>
        public static void SetDependencies(AssetInfoManifest assetInfoManifest, AssetBundleManifest assetBundleManifest)
        {
            var assetInfos = assetInfoManifest.GetAssetInfos().Where(x => x.IsAssetBundle).ToArray();

            foreach (var assetInfo in assetInfos)
            {
                var dependencies = assetBundleManifest.GetDirectDependencies(assetInfo.AssetBundle.AssetBundleName);

                assetInfo.AssetBundle.SetDependencies(dependencies);
            }
        }
        public void SetManifest(AssetInfoManifest manifest)
        {
            this.manifest = manifest;

            BuildAssetInfoTable();

            if (manifest != null)
            {
                CleanUnuseCache();
            }
        }
        //----- field -----

        //----- property -----

        //----- method -----

        public void Build(string exportPath, string assetBundlePath, AssetInfoManifest assetInfoManifest, string password, Action <int, int> reportProgress)
        {
            var assetInfos = assetInfoManifest.GetAssetInfos()
                             .Where(x => x.IsAssetBundle)
                             .Where(x => !string.IsNullOrEmpty(x.AssetBundle.AssetBundleName))
                             .GroupBy(x => x.AssetBundle.AssetBundleName)
                             .Select(x => x.FirstOrDefault())
                             .ToList();

            assetInfos.Add(AssetInfoManifest.GetManifestAssetInfo());

            var total = assetInfos.Count;

            reportProgress(0, total);

            var progress = new Progress();

            var events = new List <WaitHandle>();

            // スレッドで分割処理.

            var workerNo    = 0;
            var workerPaths = new List <AssetInfo> [MaxWorkerCount];

            foreach (var assetInfo in assetInfos)
            {
                if (workerPaths[workerNo] == null)
                {
                    workerPaths[workerNo] = new List <AssetInfo>();
                }

                workerPaths[workerNo].Add(assetInfo);

                workerNo = (workerNo + 1) % MaxWorkerCount;
            }

            foreach (var item in workerPaths)
            {
                if (item == null)
                {
                    continue;
                }

                events.Add(StartWorker(exportPath, assetBundlePath, password, item.ToArray(), progress));
            }

            while (!WaitHandle.WaitAll(events.ToArray(), 100))
            {
                reportProgress(progress.count, total);
            }

            reportProgress(progress.count, total);
        }
Beispiel #10
0
        public AssetInfo[] GetAllTargetAssetInfo(AssetInfoManifest assetInfoManifest)
        {
            var assetInfos = assetInfoManifest.GetAssetInfos()
                             .Where(x => x.IsAssetBundle)
                             .Where(x => !string.IsNullOrEmpty(x.AssetBundle.AssetBundleName))
                             .GroupBy(x => x.AssetBundle.AssetBundleName)
                             .Select(x => x.FirstOrDefault())
                             .ToList();

            assetInfos.Add(AssetInfoManifest.GetManifestAssetInfo());

            return(assetInfos.ToArray());
        }
Beispiel #11
0
        public static async Task SetCriAssetFileInfo(string exportPath, AssetInfoManifest assetInfoManifest)
        {
            var assetInfos = Reflection.GetPrivateField <AssetInfoManifest, AssetInfo[]>(assetInfoManifest, "assetInfos");

            var tasks = new List <Task>();

            for (var i = 0; i < assetInfos.Length; i++)
            {
                var assetInfo = assetInfos[i];

                if (assetInfo.IsAssetBundle)
                {
                    continue;
                }

                var extension = Path.GetExtension(assetInfo.FileName);

                if (CriAssetDefinition.AssetAllExtensions.Any(x => x == extension))
                {
                    var filePath = PathUtility.Combine(new string[] { exportPath, assetInfo.FileName });

                    var task = Task.Run(() =>
                    {
                        if (!File.Exists(filePath))
                        {
                            return;
                        }

                        var fileInfo = new FileInfo(filePath);

                        var size = fileInfo.Exists ? fileInfo.Length : -1;
                        var crc  = FileUtility.GetCRC(filePath);
                        var hash = FileUtility.GetHash(filePath);

                        assetInfo.SetFileInfo(size, crc, hash);
                    });

                    tasks.Add(task);
                }
            }

            await Task.WhenAll(tasks);

            Reflection.SetPrivateField(assetInfoManifest, "assetInfos", assetInfos);

            UnityEditorUtility.SaveAsset(assetInfoManifest);

            assetInfoManifest.BuildCache(true);

            EditorUtility.ClearProgressBar();
        }
Beispiel #12
0
        /// <summary>
        /// マニフェストファイルに存在しないキャッシュファイルを破棄.
        /// </summary>
        public string[] GetDisUsedFilePaths()
        {
            if (simulateMode)
            {
                return(null);
            }

            if (manifest == null)
            {
                return(null);
            }

            var installDir = GetFilePath(null);

            if (string.IsNullOrEmpty(installDir))
            {
                return(null);
            }

            if (!Directory.Exists(installDir))
            {
                return(null);
            }

            var directory = Path.GetDirectoryName(installDir);

            if (!Directory.Exists(directory))
            {
                return(null);
            }

            var cacheFiles = Directory.GetFiles(installDir, "*", SearchOption.AllDirectories);

            var allAssetInfos = manifest.GetAssetInfos().ToList();

            allAssetInfos.Add(AssetInfoManifest.GetManifestAssetInfo());

            var managedFiles = allAssetInfos
                               .Select(x => GetFilePath(x))
                               .Distinct()
                               .ToHashSet();

            return(cacheFiles
                   .Select(x => PathUtility.ConvertPathSeparator(x))
                   .Where(x => Path.GetExtension(x) == PackageExtension)
                   .Where(x => !managedFiles.Contains(x))
                   .ToArray());
        }
        /// <summary>
        /// アセット情報ファイルを更新.
        /// </summary>
        public IObservable <Unit> UpdateAssetInfoManifest()
        {
            if (simulateMode)
            {
                return(Observable.ReturnUnit());
            }

            if (localMode)
            {
                return(Observable.ReturnUnit());
            }

            var manifestAssetInfo = AssetInfoManifest.GetManifestAssetInfo();

            return(Observable.FromMicroCoroutine(() => UpdateAssetBundleInternal(manifestAssetInfo)));
        }
Beispiel #14
0
        /// <summary> アセットバンドルをパッケージ化 </summary>
        public static void BuildPackage(string exportPath, AssetInfoManifest assetInfoManifest, string password)
        {
            var assetBundlePath = GetAssetBundleOutputPath();

            var assetbundlePackageBuilder = new BuildAssetbundlePackage();

            Action <int, int> reportProgress = (current, total) =>
            {
                var title = "Build AssetbundlePackage";
                var info  = string.Format("Build progress ({0}/{1})", current, total);

                EditorUtility.DisplayProgressBar(title, info, current / (float)total);
            };

            assetbundlePackageBuilder.Build(exportPath, assetBundlePath, assetInfoManifest, password, reportProgress);

            EditorUtility.ClearProgressBar();
        }
        private void BuildAssetInfoTable()
        {
            assetInfosByAssetBundleName.Clear();

            if (manifest != null)
            {
                assetInfosByAssetBundleName = manifest.GetAssetInfos()
                                              .Where(x => x.IsAssetBundle)
                                              .GroupBy(x => x.AssetBundle.AssetBundleName)
                                              .ToDictionary(x => x.Key, x => x.ToArray());
            }

            // ※ アセット管理情報内にAssetInfoManifestの情報は入っていないので明示的に追加する.

            var manifestAssetInfo = AssetInfoManifest.GetManifestAssetInfo();

            assetInfosByAssetBundleName[manifestAssetInfo.AssetBundle.AssetBundleName] = new AssetInfo[] { manifestAssetInfo };
        }
Beispiel #16
0
        /// <summary> 更新されたアセット情報取得 </summary>
        public async Task <AssetInfo[]> GetUpdateTargetAssetInfo(AssetInfoManifest assetInfoManifest, Dictionary <string, DateTime> lastWriteTimeTable)
        {
            var assetBundlePath = GetAssetBundleOutputPath();

            var assetInfos = GetAllTargetAssetInfo(assetInfoManifest);

            var list = new List <AssetInfo>();

            var tasks = new List <Task>();

            foreach (var item in assetInfos)
            {
                var assetInfo = item;

                var task = Task.Run(() =>
                {
                    // アセットバンドルファイルパス.
                    var assetBundleFilePath = PathUtility.Combine(assetBundlePath, assetInfo.AssetBundle.AssetBundleName);

                    // 最終更新日を比較.

                    var prevLastWriteTime = lastWriteTimeTable.GetValueOrDefault(assetBundleFilePath, DateTime.MinValue);

                    var currentLastWriteTime = File.GetLastWriteTime(assetBundleFilePath);

                    // ビルド前と後で更新日時が変わっていたら更新対象.
                    if (currentLastWriteTime != prevLastWriteTime)
                    {
                        lock (list)
                        {
                            list.Add(assetInfo);
                        }
                    }
                });

                tasks.Add(task);
            }

            await Task.WhenAll(tasks);

            return(list.ToArray());
        }
Beispiel #17
0
        //----- property -----

        //----- method -----

        public override void OnInspectorGUI()
        {
            instance = target as AssetInfoManifest;

            if (!initialized)
            {
                assetInfos = Reflection.GetPrivateField <AssetInfoManifest, AssetInfo[]>(instance, "assetInfos");

                currentAssetInfos = assetInfos;

                asstInfoScrollView          = new AsstInfoScrollView();
                asstInfoScrollView.Contents = currentAssetInfos;

                totalAssetCountText = string.Format("Total Asset Count : {0}", assetInfos.Length);

                initialized = true;
            }

            DrawInspector();
        }
Beispiel #18
0
        //----- params -----

        //----- field -----

        //----- property -----

        //----- method -----

        /// <summary>
        /// CriAssetをアセットバンドルの出力先にコピー.
        /// </summary>
        public static void Generate(string exportPath, AssetInfoManifest assetInfoManifest)
        {
            var projectFolders = ProjectFolders.Instance;

            if (projectFolders == null)
            {
                return;
            }

            var externalResourcesPath = projectFolders.ExternalResourcesPath;

            Func <AssetInfo, bool> isCriAssetInfo = x =>
            {
                if (string.IsNullOrEmpty(x.FileName))
                {
                    return(false);
                }

                var extension = Path.GetExtension(x.ResourcePath);

                return(CriAssetDefinition.AssetAllExtensions.Contains(extension));
            };

            var assetInfos = assetInfoManifest.GetAssetInfos().Where(x => isCriAssetInfo(x)).ToArray();

            foreach (var assetInfo in assetInfos)
            {
                var source = PathUtility.Combine(new string[] { UnityPathUtility.GetProjectFolderPath(), externalResourcesPath, assetInfo.ResourcePath });
                var dest   = PathUtility.Combine(new string[] { exportPath, assetInfo.FileName });

                var directory = Path.GetDirectoryName(dest);

                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                File.Copy(source, dest, true);
            }
        }
Beispiel #19
0
        /// <summary> AssetInfoManifest読み込み </summary>
        private async Task LoadAssetInfoManifest()
        {
            Debug.Log("Load AssetInfoManifest.package.");

            var projectFolders = ProjectFolders.Instance;

            assetInfoManifestFilePath = GetAssetInfoManifestFilePath(files);

            var manifestAssetInfo = AssetInfoManifest.GetManifestAssetInfo();

            var assetPath = PathUtility.Combine(projectFolders.ExternalResourcesPath, manifestAssetInfo.ResourcePath);

            var cryptoKey = GetCryptoKey();

            using (var fileStream = new FileStream(assetInfoManifestFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (var aesStream = new SeekableCryptoStream(fileStream, cryptoKey))
                {
                    var bundleLoadRequest = AssetBundle.LoadFromStreamAsync(aesStream);

                    while (!bundleLoadRequest.isDone)
                    {
                        await Task.Delay(25);
                    }

                    var assetBundle = bundleLoadRequest.assetBundle;

                    var loadAssetAsync = assetBundle.LoadAssetAsync(assetPath, typeof(AssetInfoManifest));

                    while (!loadAssetAsync.isDone)
                    {
                        await Task.Delay(25);
                    }

                    assetInfoManifest = loadAssetAsync.asset as AssetInfoManifest;

                    assetBundle.Unload(false);
                }
            }
        }
Beispiel #20
0
        //----- property -----

        //----- method -----

        public override void OnInspectorGUI()
        {
            instance = target as AssetInfoManifest;

            if (!initialized)
            {
                var assetInfos = Reflection.GetPrivateField <AssetInfoManifest, AssetInfo[]>(instance, "assetInfos");

                currentInfos = assetInfos.GroupBy(x => x.GroupName)
                               .Select(x => new AssetGroupInfo(x.Key, x.ToArray()))
                               .ToArray();

                asstInfoScrollView          = new AsstInfoScrollView();
                asstInfoScrollView.Contents = currentInfos;

                totalAssetCountText = string.Format("Total Asset Count : {0}", assetInfos.Length);

                initialized = true;
            }

            DrawInspector();
        }
Beispiel #21
0
        /// <summary> アセットバンドルの参照情報を書き込み </summary>
        public void SetDependencies(AssetInfoManifest assetInfoManifest, BuildResult buildResult)
        {
            var assetInfos = assetInfoManifest.GetAssetInfos().Where(x => x.IsAssetBundle).ToArray();

            foreach (var assetInfo in assetInfos)
            {
                if (!assetInfo.IsAssetBundle)
                {
                    continue;
                }

                var assetBundleName = assetInfo.AssetBundle.AssetBundleName;

                var detail = buildResult.GetDetails(assetBundleName);

                if (!detail.HasValue)
                {
                    throw new InvalidDataException("AssetBundle build info not found. : " + assetBundleName);
                }

                assetInfo.AssetBundle.SetDependencies(detail.Value.Dependencies);
            }
        }
Beispiel #22
0
        //----- params -----

        //----- field -----

        //----- property -----

        //----- method -----

        public static AssetInfoManifest Generate()
        {
            AssetInfoManifest manifest = null;

            var assetManagement = AssetManagement.Instance;

            assetManagement.Initialize();

            using (new AssetEditingScope())
            {
                DeleteUndefinedAssetBundleNames(assetManagement);

                manifest = GenerateManifest(assetManagement);

                ApplyAssetBundleName(assetManagement, manifest);
            }

            AssetDatabase.RemoveUnusedAssetBundleNames();
            AssetDatabase.Refresh();

            AssetManagement.Prefs.manifestUpdateRequest = false;

            return(manifest);
        }
        /// <summary>
        /// マニフェストファイルに存在しないキャッシュファイルを破棄.
        /// </summary>
        private void CleanUnuseCache()
        {
            if (simulateMode)
            {
                return;
            }

            if (manifest == null)
            {
                return;
            }

            var installDir = BuildFilePath(null);

            if (string.IsNullOrEmpty(installDir))
            {
                return;
            }

            if (!Directory.Exists(installDir))
            {
                return;
            }

            var sw = System.Diagnostics.Stopwatch.StartNew();

            var builder = new StringBuilder();

            var directory = Path.GetDirectoryName(installDir);

            if (Directory.Exists(directory))
            {
                var cacheFiles = Directory.GetFiles(installDir, "*", SearchOption.AllDirectories);

                var allAssetInfos = manifest.GetAssetInfos().ToList();

                allAssetInfos.Add(AssetInfoManifest.GetManifestAssetInfo());

                var managedFiles = allAssetInfos
                                   .Select(x => BuildFilePath(x))
                                   .Select(x => PathUtility.ConvertPathSeparator(x))
                                   .Distinct()
                                   .ToHashSet();

                var targets = cacheFiles
                              .Select(x => PathUtility.ConvertPathSeparator(x))
                              .Where(x => Path.GetExtension(x) == PackageExtension)
                              .Where(x => !managedFiles.Contains(x))
                              .ToArray();

                foreach (var target in targets)
                {
                    if (!File.Exists(target))
                    {
                        continue;
                    }

                    File.SetAttributes(target, FileAttributes.Normal);
                    File.Delete(target);

                    builder.AppendLine(target);
                }

                var deleteDirectorys = DirectoryUtility.DeleteEmpty(installDir);

                deleteDirectorys.ForEach(x => builder.AppendLine(x));

                sw.Stop();

                var log = builder.ToString();

                if (!string.IsNullOrEmpty(log))
                {
                    UnityConsole.Info("Delete unuse cached assetbundles ({0}ms)\n{1}", sw.Elapsed.TotalMilliseconds, log);
                }
            }
        }
Beispiel #24
0
        public static async Task SetAssetBundleFileInfo(string exportPath, AssetInfoManifest assetInfoManifest, BuildResult buildResult)
        {
            var assetInfos = Reflection.GetPrivateField <AssetInfoManifest, AssetInfo[]>(assetInfoManifest, "assetInfos");

            var assetBundleGroups = assetInfos
                                    .Where(x => x.IsAssetBundle)
                                    .GroupBy(x => x.AssetBundle.AssetBundleName);

            var tasks = new Dictionary <string, Task>();

            foreach (var assetBundleGroup in assetBundleGroups)
            {
                var assetBundleName = assetBundleGroup.Key;

                if (tasks.ContainsKey(assetBundleName))
                {
                    continue;
                }

                var assetInfo = assetBundleGroup.First();

                var detail = buildResult.GetDetails(assetBundleName);

                if (!detail.HasValue)
                {
                    throw new InvalidDataException("AssetBundle build info not found. : " + assetBundleName);
                }

                var filePath = PathUtility.Combine(exportPath, assetBundleName);

                // CRC.
                assetInfo.AssetBundle.SetCRC(detail.Value.Crc);

                // Hash.
                var assetBundleHash = detail.Value.Hash.ToString();

                // ファイルハッシュ・ファイルサイズ設定.

                var packageFilePath = Path.ChangeExtension(filePath, AssetBundleManager.PackageExtension);

                var task = Task.Run(() =>
                {
                    if (!File.Exists(packageFilePath))
                    {
                        throw new InvalidDataException("Package file not found. : " + packageFilePath);
                    }

                    var fileInfo = new FileInfo(packageFilePath);

                    var size = fileInfo.Exists ? fileInfo.Length : -1;
                    var crc  = FileUtility.GetCRC(packageFilePath);

                    // 同じアセットバンドル名の全アセット情報を更新.
                    foreach (var item in assetBundleGroup)
                    {
                        item.SetFileInfo(size, crc, assetBundleHash);
                    }
                });

                tasks.Add(assetBundleName, task);
            }

            await Task.WhenAll(tasks.Values);

            Reflection.SetPrivateField(assetInfoManifest, "assetInfos", assetInfos);

            UnityEditorUtility.SaveAsset(assetInfoManifest);

            assetInfoManifest.BuildCache(true);

            EditorUtility.ClearProgressBar();
        }
Beispiel #25
0
        public static bool AssetDependenciesValidate(AssetInfoManifest assetInfoManifest)
        {
            var projectFolders = ProjectFolders.Instance;

            var config = ManageConfig.Instance;

            var externalResourcesPath = projectFolders.ExternalResourcesPath;

            var allAssetInfos = assetInfoManifest.GetAssetInfos().ToArray();

            var ignoreValidatePaths = config.IgnoreValidateTarget
                                      .Where(x => x != null)
                                      .Select(x => AssetDatabase.GetAssetPath(x))
                                      .ToArray();

            Func <string, bool> checkInvalid = path =>
            {
                // 除外対象拡張子はチェック対象外.

                var extension = Path.GetExtension(path);

                if (IgnoreDependentCheckExtensions.Any(y => y == extension))
                {
                    return(false);
                }

                // 除外対象.

                if (ignoreValidatePaths.Any(x => path.StartsWith(x)))
                {
                    return(false);
                }

                // 外部アセット対象ではない.

                if (!path.StartsWith(externalResourcesPath))
                {
                    return(true);
                }

                return(false);
            };

            using (new DisableStackTraceScope())
            {
                foreach (var assetInfo in allAssetInfos)
                {
                    var assetPath = PathUtility.Combine(externalResourcesPath, assetInfo.ResourcePath);

                    var dependencies = AssetDatabase.GetDependencies(assetPath);

                    var invalidDependencies = dependencies.Where(x => checkInvalid(x)).ToArray();

                    if (invalidDependencies.Any())
                    {
                        var builder = new StringBuilder();

                        builder.AppendFormat("Asset: {0}", assetPath).AppendLine();
                        builder.AppendLine("Invalid Dependencies:");

                        foreach (var item in invalidDependencies)
                        {
                            builder.AppendLine(item);
                        }

                        Debug.LogWarningFormat(builder.ToString());

                        return(false);
                    }
                }
            }

            return(true);
        }
Beispiel #26
0
 public void SetManifest(AssetInfoManifest manifest)
 {
     this.manifest = manifest;
 }
        public void SetManifest(AssetInfoManifest manifest)
        {
            this.manifest = manifest;

            CleanUnuseCache();
        }
Beispiel #28
0
        public static async Task <string> Build(string exportPath, AssetInfoManifest assetInfoManifest, bool openExportFolder = true)
        {
            if (string.IsNullOrEmpty(exportPath))
            {
                return(null);
            }

            if (Directory.Exists(exportPath))
            {
                Directory.Delete(exportPath, true);
            }

            var versionHash = string.Empty;

            var assetManagement = AssetManagement.Instance;

            assetManagement.Initialize();

            var buildAssetBundle = new BuildAssetBundle(BundlePipeline);

            EditorApplication.LockReloadAssemblies();

            try
            {
                var stopwatch = System.Diagnostics.Stopwatch.StartNew();

                var logBuilder = new StringBuilder();

                var manageConfig = ManageConfig.Instance;

                var cryptoKey = manageConfig.CryptoKey;
                var cryptoIv  = manageConfig.CryptoIv;

                var assetBundlePath = buildAssetBundle.GetAssetBundleOutputPath();

                // 暗号化鍵情報の変更チェック.

                var cryptoChanged = BuildAssetBundlePackage.CheckCryptoFile(assetBundlePath, cryptoKey, cryptoIv);

                using (new DisableStackTraceScope())
                {
                    var processTime = System.Diagnostics.Stopwatch.StartNew();

                    //------ アセットバンドル名を設定------

                    using (new BuildLogScope(logBuilder, processTime, "ApplyAllAssetBundleName"))
                    {
                        assetManagement.ApplyAllAssetBundleName();
                    }

                    //------ キャッシュ済みアセットバンドルの最終更新日時取得 ------

                    Dictionary <string, DateTime> cachedFileLastWriteTimeTable = null;

                    using (new BuildLogScope(logBuilder, processTime, "GetCachedFileLastWriteTimeTable"))
                    {
                        cachedFileLastWriteTimeTable = await buildAssetBundle.GetCachedFileLastWriteTimeTable();
                    }

                    //------ CRIアセットを生成 ------

                    #if ENABLE_CRIWARE_ADX || ENABLE_CRIWARE_SOFDEC
                    using (new BuildLogScope(logBuilder, processTime, "GenerateCriAsset"))
                    {
                        CriAssetGenerator.Generate(exportPath, assetInfoManifest);
                    }
                    #endif

                    //------ AssetBundleをビルド ------

                    BuildResult buildResult = null;

                    using (new BuildLogScope(logBuilder, processTime, "BuildAllAssetBundles"))
                    {
                        buildResult = buildAssetBundle.BuildAllAssetBundles();
                    }

                    if (!buildResult.IsSuccess)
                    {
                        Debug.LogError("Build ExternalResource failed.");

                        return(null);
                    }

                    //------ 未登録のアセットバンドル情報追加 ------

                    using (new BuildLogScope(logBuilder, processTime, "AddUnregisteredAssetInfos"))
                    {
                        buildAssetBundle.AddUnregisteredAssetInfos(assetInfoManifest, buildResult);
                    }

                    //------ 不要になった古いAssetBundle削除 ------

                    using (new BuildLogScope(logBuilder, processTime, "CleanUnUseAssetBundleFiles"))
                    {
                        buildAssetBundle.CleanUnUseAssetBundleFiles(buildResult);
                    }

                    //------ AssetBundleファイルをパッケージ化 ------

                    // 暗号化鍵情報の書き込み.

                    using (new BuildLogScope(logBuilder, processTime, "CreateCryptoFile"))
                    {
                        BuildAssetBundlePackage.CreateCryptoFile(assetBundlePath, cryptoKey, cryptoIv);
                    }

                    // 更新対象のアセット情報取得.

                    var assetInfos        = new AssetInfo[0];
                    var updatedAssetInfos = new AssetInfo[0];

                    using (new BuildLogScope(logBuilder, processTime, "GetUpdateTargetAssetInfo"))
                    {
                        assetInfos = buildAssetBundle.GetAllTargetAssetInfo(assetInfoManifest);

                        // 暗号化キーが変わっていたら全て更新対象.
                        if (cryptoChanged)
                        {
                            updatedAssetInfos = assetInfos;
                        }
                        // 差分がある対象だけ抽出.
                        else
                        {
                            updatedAssetInfos = await buildAssetBundle.GetUpdateTargetAssetInfo(assetInfoManifest, cachedFileLastWriteTimeTable);
                        }
                    }

                    // パッケージファイル作成.

                    using (new BuildLogScope(logBuilder, processTime, "BuildPackage"))
                    {
                        await BuildAssetBundlePackage.BuildAllAssetBundlePackage(exportPath, assetBundlePath, assetInfos, updatedAssetInfos, cryptoKey, cryptoIv);
                    }

                    //------ ビルド成果物の情報をAssetInfoManifestに書き込み ------

                    using (new BuildLogScope(logBuilder, processTime, "AssetInfoManifest : SetAssetBundleFileInfo"))
                    {
                        await AssetInfoManifestGenerator.SetAssetBundleFileInfo(assetBundlePath, assetInfoManifest, buildResult);

                        #if ENABLE_CRIWARE_ADX || ENABLE_CRIWARE_SOFDEC
                        await AssetInfoManifestGenerator.SetCriAssetFileInfo(exportPath, assetInfoManifest);
                        #endif
                    }

                    //------ アセットバンドルの参照情報をAssetInfoManifestに書き込み ------

                    using (new BuildLogScope(logBuilder, processTime, "AssetInfoManifest : SetAssetBundleDependencies"))
                    {
                        buildAssetBundle.SetDependencies(assetInfoManifest, buildResult);
                    }

                    //------ バージョンハッシュ情報をAssetInfoManifestに書き込み ------

                    using (new BuildLogScope(logBuilder, processTime, "AssetInfoManifest : SetAssetInfoHash"))
                    {
                        buildAssetBundle.SetAssetInfoHash(assetInfoManifest);
                    }

                    //------ 再度AssetInfoManifestだけビルドを実行 ------

                    using (new BuildLogScope(logBuilder, processTime, "Rebuild AssetInfoManifest"))
                    {
                        buildAssetBundle.BuildAssetInfoManifest();
                    }

                    //------ AssetInfoManifestファイルをパッケージ化 ------

                    using (new BuildLogScope(logBuilder, processTime, "BuildPackage AssetInfoManifest"))
                    {
                        await BuildAssetBundlePackage.BuildAssetInfoManifestPackage(exportPath, assetBundlePath, cryptoKey, cryptoIv);
                    }
                }

                versionHash = assetInfoManifest.VersionHash;

                //------ バージョンをファイル出力------

                GenerateVersionFile(exportPath, versionHash);

                //------ ログ出力------

                stopwatch.Stop();

                // ビルド情報.

                var buildLogText = new StringBuilder();

                var totalSeconds = stopwatch.Elapsed.TotalSeconds;

                buildLogText.AppendFormat("Build ExternalResource Complete. ({0:F2}sec)", totalSeconds).AppendLine();
                buildLogText.AppendLine();
                buildLogText.AppendFormat("VersionHash : {0}", versionHash).AppendLine();
                buildLogText.AppendLine();
                buildLogText.AppendLine(logBuilder.ToString());
                buildLogText.AppendLine();

                UnityConsole.Event(ExternalResources.ConsoleEventName, ExternalResources.ConsoleEventColor, buildLogText.ToString());

                //------ 出力先フォルダを開く------

                if (openExportFolder)
                {
                    UnityEditorUtility.OpenFolder(exportPath);
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                throw;
            }
            finally
            {
                EditorApplication.UnlockReloadAssemblies();
            }

            return(versionHash);
        }
Beispiel #29
0
        private static void ApplyAssetBundleName(AssetManageManager assetManageManager, AssetInfoManifest manifest)
        {
            var assetInfos = manifest.GetAssetInfos().ToArray();

            var count = assetInfos.Length;

            AssetDatabase.StartAssetEditing();

            for (var i = 0; i < count; i++)
            {
                var assetInfo = assetInfos[i];

                EditorUtility.DisplayProgressBar("ApplyAssetBundleName", assetInfo.ResourcePath, (float)i / count);

                var assetPath = PathUtility.Combine(assetManageManager.ExternalResourcesPath, assetInfo.ResourcePath);

                if (assetInfo.IsAssetBundle)
                {
                    assetManageManager.SetAssetBundleName(assetPath, assetInfo.AssetBundle.AssetBundleName);
                }
            }

            AssetDatabase.StopAssetEditing();

            EditorUtility.ClearProgressBar();
        }
Beispiel #30
0
        public void SetManifest(AssetInfoManifest manifest)
        {
            this.manifest = manifest;

            BuildAssetInfoTable();
        }