BuildScript.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEditor;
  5. using UnityEngine;
  6. namespace VEngine.Editor.Builds
  7. {
  8. public static class BuildScript
  9. {
  10. public static Action<BuildTask> postprocessBuildBundles;
  11. public static Action<BuildTask> preprocessBuildBundles;
  12. public static void BuildBundles(BuildTask task)
  13. {
  14. if (preprocessBuildBundles != null) preprocessBuildBundles(task);
  15. task.BuildBundles();
  16. if (postprocessBuildBundles != null) postprocessBuildBundles(task);
  17. }
  18. public static void BuildBundles()
  19. {
  20. BuildBundles(new BuildTask());
  21. }
  22. public static void BuildCustomBundles(string[] resRootDirNames, string settingName)
  23. {
  24. var task = new BuildTask();
  25. if (preprocessBuildBundles != null) preprocessBuildBundles(task);
  26. task.BuildCustomBundles(resRootDirNames, settingName);
  27. if (postprocessBuildBundles != null) postprocessBuildBundles(task);
  28. }
  29. private static string GetTimeForNow()
  30. {
  31. return DateTime.Now.ToString("yyyyMMdd-HHmmss");
  32. }
  33. public static string GetBuildTargetName(BuildTarget target)
  34. {
  35. var productName = "xc" + "-v" + UnityEditor.PlayerSettings.bundleVersion + ".";
  36. var targetName = $"/{productName}-{GetTimeForNow()}";
  37. switch (target)
  38. {
  39. case BuildTarget.Android:
  40. return targetName + ".apk";
  41. case BuildTarget.StandaloneWindows:
  42. case BuildTarget.StandaloneWindows64:
  43. return targetName + ".exe";
  44. case BuildTarget.StandaloneOSX:
  45. return targetName + ".app";
  46. default:
  47. return targetName;
  48. }
  49. }
  50. public static void BuildPlayer()
  51. {
  52. var path = Path.Combine(Environment.CurrentDirectory, "Build");
  53. if (path.Length == 0) return;
  54. BuildPlayer(path);
  55. }
  56. public static void BuildPlayer(string path)
  57. {
  58. var levels = new List<string>();
  59. foreach (var scene in EditorBuildSettings.scenes)
  60. if (scene.enabled)
  61. levels.Add(scene.path);
  62. if (levels.Count == 0)
  63. {
  64. Debug.Log("Nothing to build.");
  65. return;
  66. }
  67. var buildTarget = EditorUserBuildSettings.activeBuildTarget;
  68. var buildTargetName = GetBuildTargetName(buildTarget);
  69. if (buildTargetName == null) return;
  70. var buildPlayerOptions = new BuildPlayerOptions
  71. {
  72. scenes = levels.ToArray(),
  73. locationPathName = path + buildTargetName,
  74. target = buildTarget,
  75. options = EditorUserBuildSettings.development
  76. ? BuildOptions.Development
  77. : BuildOptions.None
  78. };
  79. BuildPipeline.BuildPlayer(buildPlayerOptions);
  80. }
  81. public static void CopyToStreamingAssets()
  82. {
  83. var settings = Settings.GetDefaultSettings();
  84. var destinationDir = Settings.BuildPlayerDataPath;
  85. if (Directory.Exists(destinationDir)) Directory.Delete(destinationDir, true);
  86. Directory.CreateDirectory(destinationDir);
  87. var bundles = Settings.GetBundlesInBuild(true);
  88. foreach (var bundle in bundles)
  89. {
  90. var destFile = Path.Combine(Settings.BuildPlayerDataPath, bundle.nameWithAppendHash);
  91. var srcFile = Settings.GetBuildPath(bundle.nameWithAppendHash);
  92. if (!File.Exists(srcFile))
  93. {
  94. Debug.LogWarningFormat("Bundle not found: {0}", bundle.name);
  95. continue;
  96. }
  97. var dir = Path.GetDirectoryName(destFile);
  98. if (!Directory.Exists(dir) && !string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir);
  99. File.Copy(srcFile, destFile, true);
  100. }
  101. var config = Settings.GetPlayerSettings();
  102. config.assets = bundles.ConvertAll(o => o.nameWithAppendHash);
  103. config.offlineMode = settings.offlineMode;
  104. Settings.SaveAsset(config);
  105. }
  106. public static void ClearHistory()
  107. {
  108. var usedFiles = new List<string>
  109. {
  110. Settings.GetPlatformName(),
  111. Settings.GetPlatformName() + ".manifest"
  112. };
  113. var manifest = Settings.GetManifest();
  114. usedFiles.Add($"{manifest.name}");
  115. usedFiles.Add($"{manifest.name}.version");
  116. var version = ManifestVersion.Load(Settings.GetBuildPath($"{manifest.name}.version"));
  117. usedFiles.Add($"{manifest.name}_v{version.version}_{version.crc}");
  118. usedFiles.Add($"{manifest.name}_v{version.version}_{version.crc}.version");
  119. foreach (var bundle in manifest.bundles)
  120. {
  121. usedFiles.Add(bundle.nameWithAppendHash);
  122. usedFiles.Add($"{bundle.name}.manifest");
  123. }
  124. var files = Directory.GetFiles(Settings.PlatformBuildPath);
  125. foreach (var file in files)
  126. {
  127. var name = Path.GetFileName(file);
  128. if (usedFiles.Contains(name)) continue;
  129. File.Delete(file);
  130. Debug.LogFormat("Delete {0}", file);
  131. }
  132. }
  133. }
  134. }