BuildBundleInfo.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using System;
  2. using System.Linq;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEditor;
  6. namespace YooAsset.Editor
  7. {
  8. public class BuildBundleInfo
  9. {
  10. public class InfoWrapper
  11. {
  12. /// <summary>
  13. /// 构建内容的哈希值
  14. /// </summary>
  15. public string ContentHash { set; get; }
  16. /// <summary>
  17. /// 文件哈希值
  18. /// </summary>
  19. public string FileHash { set; get; }
  20. /// <summary>
  21. /// 文件哈希值
  22. /// </summary>
  23. public string FileCRC { set; get; }
  24. /// <summary>
  25. /// 文件哈希值
  26. /// </summary>
  27. public long FileSize { set; get; }
  28. /// <summary>
  29. /// 构建输出的文件路径
  30. /// </summary>
  31. public string BuildOutputFilePath { set; get; }
  32. /// <summary>
  33. /// 补丁包输出文件路径
  34. /// </summary>
  35. public string PackageOutputFilePath { set; get; }
  36. }
  37. /// <summary>
  38. /// 资源包名称
  39. /// </summary>
  40. public string BundleName { private set; get; }
  41. /// <summary>
  42. /// 参与构建的资源列表
  43. /// 注意:不包含零依赖资源和冗余资源
  44. /// </summary>
  45. public readonly List<BuildAssetInfo> AllMainAssets = new List<BuildAssetInfo>();
  46. /// <summary>
  47. /// 补丁文件信息
  48. /// </summary>
  49. public readonly InfoWrapper BundleInfo = new InfoWrapper();
  50. /// <summary>
  51. /// Bundle文件的加载方法
  52. /// </summary>
  53. public EBundleLoadMethod LoadMethod { set; get; }
  54. /// <summary>
  55. /// 加密生成文件的路径
  56. /// 注意:如果未加密该路径为空
  57. /// </summary>
  58. public string EncryptedFilePath { set; get; }
  59. /// <summary>
  60. /// 是否为原生文件
  61. /// </summary>
  62. public bool IsRawFile
  63. {
  64. get
  65. {
  66. foreach (var assetInfo in AllMainAssets)
  67. {
  68. if (assetInfo.IsRawAsset)
  69. return true;
  70. }
  71. return false;
  72. }
  73. }
  74. /// <summary>
  75. /// 是否为加密文件
  76. /// </summary>
  77. public bool IsEncryptedFile
  78. {
  79. get
  80. {
  81. if (string.IsNullOrEmpty(EncryptedFilePath))
  82. return false;
  83. else
  84. return true;
  85. }
  86. }
  87. public BuildBundleInfo(string bundleName)
  88. {
  89. BundleName = bundleName;
  90. }
  91. /// <summary>
  92. /// 添加一个打包资源
  93. /// </summary>
  94. public void PackAsset(BuildAssetInfo assetInfo)
  95. {
  96. if (IsContainsAsset(assetInfo.AssetPath))
  97. throw new System.Exception($"Asset is existed : {assetInfo.AssetPath}");
  98. AllMainAssets.Add(assetInfo);
  99. }
  100. /// <summary>
  101. /// 是否包含指定资源
  102. /// </summary>
  103. public bool IsContainsAsset(string assetPath)
  104. {
  105. foreach (var assetInfo in AllMainAssets)
  106. {
  107. if (assetInfo.AssetPath == assetPath)
  108. {
  109. return true;
  110. }
  111. }
  112. return false;
  113. }
  114. /// <summary>
  115. /// 获取资源包的分类标签列表
  116. /// </summary>
  117. public string[] GetBundleTags()
  118. {
  119. List<string> result = new List<string>(AllMainAssets.Count);
  120. foreach (var assetInfo in AllMainAssets)
  121. {
  122. foreach (var assetTag in assetInfo.BundleTags)
  123. {
  124. if (result.Contains(assetTag) == false)
  125. result.Add(assetTag);
  126. }
  127. }
  128. return result.ToArray();
  129. }
  130. /// <summary>
  131. /// 获取构建的资源路径列表
  132. /// </summary>
  133. public string[] GetAllMainAssetPaths()
  134. {
  135. return AllMainAssets.Select(t => t.AssetPath).ToArray();
  136. }
  137. /// <summary>
  138. /// 获取该资源包内的所有资源(包括零依赖资源和冗余资源)
  139. /// </summary>
  140. public List<string> GetAllBuiltinAssetPaths()
  141. {
  142. var packAssets = GetAllMainAssetPaths();
  143. List<string> result = new List<string>(packAssets);
  144. foreach (var assetInfo in AllMainAssets)
  145. {
  146. if (assetInfo.AllDependAssetInfos == null)
  147. continue;
  148. foreach (var dependAssetInfo in assetInfo.AllDependAssetInfos)
  149. {
  150. // 注意:依赖资源里只添加零依赖资源和冗余资源
  151. if (dependAssetInfo.HasBundleName() == false)
  152. {
  153. if (result.Contains(dependAssetInfo.AssetPath) == false)
  154. result.Add(dependAssetInfo.AssetPath);
  155. }
  156. }
  157. }
  158. return result;
  159. }
  160. /// <summary>
  161. /// 创建AssetBundleBuild类
  162. /// </summary>
  163. public UnityEditor.AssetBundleBuild CreatePipelineBuild()
  164. {
  165. // 注意:我们不在支持AssetBundle的变种机制
  166. AssetBundleBuild build = new AssetBundleBuild();
  167. build.assetBundleName = BundleName;
  168. build.assetBundleVariant = string.Empty;
  169. build.assetNames = GetAllMainAssetPaths();
  170. return build;
  171. }
  172. /// <summary>
  173. /// 获取所有写入补丁清单的资源
  174. /// </summary>
  175. public BuildAssetInfo[] GetAllManifestAssetInfos()
  176. {
  177. return AllMainAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
  178. }
  179. /// <summary>
  180. /// 创建PackageBundle类
  181. /// </summary>
  182. internal PackageBundle CreatePackageBundle()
  183. {
  184. PackageBundle packageBundle = new PackageBundle();
  185. packageBundle.BundleName = BundleName;
  186. packageBundle.FileHash = BundleInfo.FileHash;
  187. packageBundle.FileCRC = BundleInfo.FileCRC;
  188. packageBundle.FileSize = BundleInfo.FileSize;
  189. packageBundle.IsRawFile = IsRawFile;
  190. packageBundle.LoadMethod = (byte)LoadMethod;
  191. packageBundle.Tags = GetBundleTags();
  192. return packageBundle;
  193. }
  194. }
  195. }