| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | using System;using System.Collections.Generic;using System.IO;using UnityEditor;using UnityEngine;namespace VEngine.Editor.Builds{    public static class BuildScript    {        public static Action<BuildTask> postprocessBuildBundles;        public static Action<BuildTask> preprocessBuildBundles;        public static void BuildBundles(BuildTask task)        {            if (preprocessBuildBundles != null) preprocessBuildBundles(task);            task.BuildBundles();            if (postprocessBuildBundles != null) postprocessBuildBundles(task);        }        public static void BuildBundles()        {            BuildBundles(new BuildTask());        }        public static void BuildCustomBundles(string[] resRootDirNames)        {            var task = new BuildTask();            if (preprocessBuildBundles != null) preprocessBuildBundles(task);            task.BuildCustomBundles(resRootDirNames);            if (postprocessBuildBundles != null) postprocessBuildBundles(task);        }        private static string GetTimeForNow()        {            return DateTime.Now.ToString("yyyyMMdd-HHmmss");        }        public static string GetBuildTargetName(BuildTarget target)        {            var productName = "xc" + "-v" + UnityEditor.PlayerSettings.bundleVersion + ".";            var targetName = $"/{productName}-{GetTimeForNow()}";            switch (target)            {                case BuildTarget.Android:                    return targetName + ".apk";                case BuildTarget.StandaloneWindows:                case BuildTarget.StandaloneWindows64:                    return targetName + ".exe";                case BuildTarget.StandaloneOSX:                    return targetName + ".app";                default:                    return targetName;            }        }        public static void BuildPlayer()        {            var path = Path.Combine(Environment.CurrentDirectory, "Build");            if (path.Length == 0) return;            BuildPlayer(path);        }        public static void BuildPlayer(string path)        {            var levels = new List<string>();            foreach (var scene in EditorBuildSettings.scenes)                if (scene.enabled)                    levels.Add(scene.path);            if (levels.Count == 0)            {                Debug.Log("Nothing to build.");                return;            }            var buildTarget = EditorUserBuildSettings.activeBuildTarget;            var buildTargetName = GetBuildTargetName(buildTarget);            if (buildTargetName == null) return;            var buildPlayerOptions = new BuildPlayerOptions            {                scenes = levels.ToArray(),                locationPathName = path + buildTargetName,                target = buildTarget,                options = EditorUserBuildSettings.development                    ? BuildOptions.Development                    : BuildOptions.None            };            BuildPipeline.BuildPlayer(buildPlayerOptions);        }        public static void CopyToStreamingAssets()        {            var settings = Settings.GetDefaultSettings();            var destinationDir = Settings.BuildPlayerDataPath;            if (Directory.Exists(destinationDir)) Directory.Delete(destinationDir, true);            Directory.CreateDirectory(destinationDir);            var bundles = Settings.GetBundlesInBuild(true);            foreach (var bundle in bundles)            {                var destFile = Path.Combine(Settings.BuildPlayerDataPath, bundle.nameWithAppendHash);                var srcFile = Settings.GetBuildPath(bundle.nameWithAppendHash);                if (!File.Exists(srcFile))                {                    Debug.LogWarningFormat("Bundle not found: {0}", bundle.name);                    continue;                }                var dir = Path.GetDirectoryName(destFile);                if (!Directory.Exists(dir) && !string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir);                File.Copy(srcFile, destFile, true);            }            var config = Settings.GetPlayerSettings();            config.assets = bundles.ConvertAll(o => o.nameWithAppendHash);            config.offlineMode = settings.offlineMode;            Settings.SaveAsset(config);        }        public static void ClearHistory()        {            var usedFiles = new List<string>            {                Settings.GetPlatformName(),                Settings.GetPlatformName() + ".manifest"            };            var manifest = Settings.GetManifest();            usedFiles.Add($"{manifest.name}");            usedFiles.Add($"{manifest.name}.version");            var version = ManifestVersion.Load(Settings.GetBuildPath($"{manifest.name}.version"));            usedFiles.Add($"{manifest.name}_v{version.version}_{version.crc}");            usedFiles.Add($"{manifest.name}_v{version.version}_{version.crc}.version");            foreach (var bundle in manifest.bundles)            {                usedFiles.Add(bundle.nameWithAppendHash);                usedFiles.Add($"{bundle.name}.manifest");            }            var files = Directory.GetFiles(Settings.PlatformBuildPath);            foreach (var file in files)            {                var name = Path.GetFileName(file);                if (usedFiles.Contains(name)) continue;                File.Delete(file);                Debug.LogFormat("Delete {0}", file);            }        }    }}
 |