DefaultBuildinFileSystemBuild.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #if UNITY_EDITOR
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEngine;
  5. namespace YooAsset
  6. {
  7. public class DefaultBuildinFileSystemBuild : UnityEditor.Build.IPreprocessBuildWithReport
  8. {
  9. public int callbackOrder { get { return 0; } }
  10. /// <summary>
  11. /// 在构建应用程序前自动生成内置资源目录文件。
  12. /// 原理:搜索StreamingAssets目录下的所有资源文件,然后将这些文件信息写入文件,并存储在Resources目录下。
  13. /// </summary>
  14. public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report)
  15. {
  16. YooLogger.Log("Begin to create catalog file !");
  17. string rootPath = YooAssetSettingsData.GetYooDefaultBuildinRoot();
  18. DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);
  19. if (rootDirectory.Exists == false)
  20. {
  21. UnityEngine.Debug.LogWarning($"Can not found StreamingAssets root directory : {rootPath}");
  22. return;
  23. }
  24. // 搜索所有Package目录
  25. DirectoryInfo[] subDirectories = rootDirectory.GetDirectories();
  26. foreach (var subDirectory in subDirectories)
  27. {
  28. string packageName = subDirectory.Name;
  29. string pacakgeDirectory = subDirectory.FullName;
  30. bool result = CreateBuildinCatalogFile(packageName, pacakgeDirectory);
  31. if (result == false)
  32. {
  33. throw new System.Exception($"Create package {packageName} catalog file failed ! See the detail error in console !");
  34. }
  35. }
  36. }
  37. /// <summary>
  38. /// 生成包裹的内置资源目录文件
  39. /// </summary>
  40. public static bool CreateBuildinCatalogFile(string packageName, string pacakgeDirectory)
  41. {
  42. // 获取资源清单版本
  43. string packageVersion;
  44. {
  45. string versionFileName = YooAssetSettingsData.GetPackageVersionFileName(packageName);
  46. string versionFilePath = $"{pacakgeDirectory}/{versionFileName}";
  47. if (File.Exists(versionFilePath) == false)
  48. {
  49. Debug.LogError($"Can not found package version file : {versionFilePath}");
  50. return false;
  51. }
  52. packageVersion = FileUtility.ReadAllText(versionFilePath);
  53. }
  54. // 加载资源清单文件
  55. PackageManifest packageManifest;
  56. {
  57. string manifestFileName = YooAssetSettingsData.GetManifestBinaryFileName(packageName, packageVersion);
  58. string manifestFilePath = $"{pacakgeDirectory}/{manifestFileName}";
  59. if (File.Exists(manifestFilePath) == false)
  60. {
  61. Debug.LogError($"Can not found package manifest file : {manifestFilePath}");
  62. return false;
  63. }
  64. var binaryData = FileUtility.ReadAllBytes(manifestFilePath);
  65. packageManifest = ManifestTools.DeserializeFromBinary(binaryData);
  66. }
  67. // 获取文件名映射关系
  68. Dictionary<string, string> fileMapping = new Dictionary<string, string>();
  69. {
  70. foreach (var packageBundle in packageManifest.BundleList)
  71. {
  72. fileMapping.Add(packageBundle.FileName, packageBundle.BundleGUID);
  73. }
  74. }
  75. // 创建内置清单实例
  76. var buildinFileCatalog = new DefaultBuildinFileCatalog();
  77. buildinFileCatalog.FileVersion = CatalogDefine.FileVersion;
  78. buildinFileCatalog.PackageName = packageName;
  79. buildinFileCatalog.PackageVersion = packageVersion;
  80. // 创建白名单查询集合
  81. HashSet<string> whiteFileList = new HashSet<string>
  82. {
  83. "link.xml",
  84. "buildlogtep.json",
  85. $"{packageName}.version",
  86. $"{packageName}_{packageVersion}.bytes",
  87. $"{packageName}_{packageVersion}.hash",
  88. $"{packageName}_{packageVersion}.json",
  89. $"{packageName}_{packageVersion}.report",
  90. DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName,
  91. DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName
  92. };
  93. // 记录所有内置资源文件
  94. DirectoryInfo rootDirectory = new DirectoryInfo(pacakgeDirectory);
  95. FileInfo[] fileInfos = rootDirectory.GetFiles();
  96. foreach (var fileInfo in fileInfos)
  97. {
  98. if (fileInfo.Extension == ".meta")
  99. continue;
  100. if (whiteFileList.Contains(fileInfo.Name))
  101. continue;
  102. string fileName = fileInfo.Name;
  103. if (fileMapping.TryGetValue(fileName, out string bundleGUID))
  104. {
  105. var wrapper = new DefaultBuildinFileCatalog.FileWrapper();
  106. wrapper.BundleGUID = bundleGUID;
  107. wrapper.FileName = fileName;
  108. buildinFileCatalog.Wrappers.Add(wrapper);
  109. }
  110. else
  111. {
  112. Debug.LogWarning($"Failed mapping file : {fileName}");
  113. }
  114. }
  115. // 创建输出文件
  116. string jsonFilePath = $"{pacakgeDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName}";
  117. if (File.Exists(jsonFilePath))
  118. File.Delete(jsonFilePath);
  119. CatalogTools.SerializeToJson(jsonFilePath, buildinFileCatalog);
  120. // 创建输出文件
  121. string binaryFilePath = $"{pacakgeDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName}";
  122. if (File.Exists(binaryFilePath))
  123. File.Delete(binaryFilePath);
  124. CatalogTools.SerializeToBinary(binaryFilePath, buildinFileCatalog);
  125. UnityEditor.AssetDatabase.Refresh();
  126. Debug.Log($"Succeed to save buildin file catalog : {binaryFilePath}");
  127. return true;
  128. }
  129. }
  130. }
  131. #endif