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, string settingName)
- {
- var task = new BuildTask();
- if (preprocessBuildBundles != null) preprocessBuildBundles(task);
- task.BuildCustomBundles(resRootDirNames, settingName);
- 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);
- }
- }
- }
- }
|