DeserializeManifestOperation.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using System.IO;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace YooAsset
  5. {
  6. internal class DeserializeManifestOperation : AsyncOperationBase
  7. {
  8. private enum ESteps
  9. {
  10. None,
  11. DeserializeFileHeader,
  12. PrepareAssetList,
  13. DeserializeAssetList,
  14. PrepareBundleList,
  15. DeserializeBundleList,
  16. Done,
  17. }
  18. private readonly BufferReader _buffer;
  19. private int _packageAssetCount;
  20. private int _packageBundleCount;
  21. private int _progressTotalValue;
  22. private ESteps _steps = ESteps.None;
  23. /// <summary>
  24. /// 解析的清单实例
  25. /// </summary>
  26. public PackageManifest Manifest { private set; get; }
  27. public DeserializeManifestOperation(byte[] binaryData)
  28. {
  29. _buffer = new BufferReader(binaryData);
  30. }
  31. internal override void Start()
  32. {
  33. _steps = ESteps.DeserializeFileHeader;
  34. }
  35. internal override void Update()
  36. {
  37. if (_steps == ESteps.None || _steps == ESteps.Done)
  38. return;
  39. try
  40. {
  41. if (_steps == ESteps.DeserializeFileHeader)
  42. {
  43. if (_buffer.IsValid == false)
  44. {
  45. _steps = ESteps.Done;
  46. Status = EOperationStatus.Failed;
  47. Error = "Buffer is invalid !";
  48. return;
  49. }
  50. // 读取文件标记
  51. uint fileSign = _buffer.ReadUInt32();
  52. if (fileSign != YooAssetSettings.ManifestFileSign)
  53. {
  54. _steps = ESteps.Done;
  55. Status = EOperationStatus.Failed;
  56. Error = "The manifest file format is invalid !";
  57. return;
  58. }
  59. // 读取文件版本
  60. string fileVersion = _buffer.ReadUTF8();
  61. if (fileVersion != YooAssetSettings.ManifestFileVersion)
  62. {
  63. _steps = ESteps.Done;
  64. Status = EOperationStatus.Failed;
  65. Error = $"The manifest file version are not compatible : {fileVersion} != {YooAssetSettings.ManifestFileVersion}";
  66. return;
  67. }
  68. // 读取文件头信息
  69. Manifest = new PackageManifest();
  70. Manifest.FileVersion = fileVersion;
  71. Manifest.EnableAddressable = _buffer.ReadBool();
  72. Manifest.LocationToLower = _buffer.ReadBool();
  73. Manifest.IncludeAssetGUID = _buffer.ReadBool();
  74. Manifest.OutputNameStyle = _buffer.ReadInt32();
  75. Manifest.PackageName = _buffer.ReadUTF8();
  76. Manifest.PackageVersion = _buffer.ReadUTF8();
  77. // 检测配置
  78. if (Manifest.EnableAddressable && Manifest.LocationToLower)
  79. throw new System.Exception("Addressable not support location to lower !");
  80. _steps = ESteps.PrepareAssetList;
  81. }
  82. if (_steps == ESteps.PrepareAssetList)
  83. {
  84. _packageAssetCount = _buffer.ReadInt32();
  85. Manifest.AssetList = new List<PackageAsset>(_packageAssetCount);
  86. Manifest.AssetDic = new Dictionary<string, PackageAsset>(_packageAssetCount);
  87. if (Manifest.EnableAddressable)
  88. Manifest.AssetPathMapping1 = new Dictionary<string, string>(_packageAssetCount);
  89. else
  90. Manifest.AssetPathMapping1 = new Dictionary<string, string>(_packageAssetCount * 2);
  91. if (Manifest.IncludeAssetGUID)
  92. Manifest.AssetPathMapping2 = new Dictionary<string, string>(_packageAssetCount);
  93. else
  94. Manifest.AssetPathMapping2 = new Dictionary<string, string>();
  95. _progressTotalValue = _packageAssetCount;
  96. _steps = ESteps.DeserializeAssetList;
  97. }
  98. if (_steps == ESteps.DeserializeAssetList)
  99. {
  100. while (_packageAssetCount > 0)
  101. {
  102. var packageAsset = new PackageAsset();
  103. packageAsset.Address = _buffer.ReadUTF8();
  104. packageAsset.AssetPath = _buffer.ReadUTF8();
  105. packageAsset.AssetGUID = _buffer.ReadUTF8();
  106. packageAsset.AssetTags = _buffer.ReadUTF8Array();
  107. packageAsset.BundleID = _buffer.ReadInt32();
  108. packageAsset.DependIDs = _buffer.ReadInt32Array();
  109. Manifest.AssetList.Add(packageAsset);
  110. // 注意:我们不允许原始路径存在重名
  111. string assetPath = packageAsset.AssetPath;
  112. if (Manifest.AssetDic.ContainsKey(assetPath))
  113. throw new System.Exception($"AssetPath have existed : {assetPath}");
  114. else
  115. Manifest.AssetDic.Add(assetPath, packageAsset);
  116. // 填充AssetPathMapping1
  117. if (Manifest.EnableAddressable)
  118. {
  119. string location = packageAsset.Address;
  120. if (Manifest.AssetPathMapping1.ContainsKey(location))
  121. throw new System.Exception($"Address have existed : {location}");
  122. else
  123. Manifest.AssetPathMapping1.Add(location, packageAsset.AssetPath);
  124. }
  125. else
  126. {
  127. string location = packageAsset.AssetPath;
  128. if (Manifest.LocationToLower)
  129. location = location.ToLower();
  130. // 添加原生路径的映射
  131. if (Manifest.AssetPathMapping1.ContainsKey(location))
  132. throw new System.Exception($"AssetPath have existed : {location}");
  133. else
  134. Manifest.AssetPathMapping1.Add(location, packageAsset.AssetPath);
  135. // 添加无后缀名路径的映射
  136. //if (Path.HasExtension(location))
  137. //{
  138. // string locationWithoutExtension = PathUtility.RemoveExtension(location);
  139. // if (Manifest.AssetPathMapping1.ContainsKey(locationWithoutExtension))
  140. // YooLogger.Warning($"AssetPath have existed : {locationWithoutExtension}");
  141. // else
  142. // Manifest.AssetPathMapping1.Add(locationWithoutExtension, packageAsset.AssetPath);
  143. //}
  144. }
  145. // 填充AssetPathMapping2
  146. if (Manifest.IncludeAssetGUID)
  147. {
  148. if (Manifest.AssetPathMapping2.ContainsKey(packageAsset.AssetGUID))
  149. throw new System.Exception($"AssetGUID have existed : {packageAsset.AssetGUID}");
  150. else
  151. Manifest.AssetPathMapping2.Add(packageAsset.AssetGUID, packageAsset.AssetPath);
  152. }
  153. _packageAssetCount--;
  154. Progress = 1f - _packageAssetCount / _progressTotalValue;
  155. if (OperationSystem.IsBusy)
  156. break;
  157. }
  158. if (_packageAssetCount <= 0)
  159. {
  160. _steps = ESteps.PrepareBundleList;
  161. }
  162. }
  163. if (_steps == ESteps.PrepareBundleList)
  164. {
  165. _packageBundleCount = _buffer.ReadInt32();
  166. Manifest.BundleList = new List<PackageBundle>(_packageBundleCount);
  167. Manifest.BundleDic = new Dictionary<string, PackageBundle>(_packageBundleCount);
  168. _progressTotalValue = _packageBundleCount;
  169. _steps = ESteps.DeserializeBundleList;
  170. }
  171. if (_steps == ESteps.DeserializeBundleList)
  172. {
  173. while (_packageBundleCount > 0)
  174. {
  175. var packageBundle = new PackageBundle();
  176. packageBundle.BundleName = _buffer.ReadUTF8();
  177. packageBundle.FileHash = _buffer.ReadUTF8();
  178. packageBundle.FileCRC = _buffer.ReadUTF8();
  179. packageBundle.FileSize = _buffer.ReadInt64();
  180. packageBundle.IsRawFile = _buffer.ReadBool();
  181. packageBundle.LoadMethod = _buffer.ReadByte();
  182. packageBundle.Tags = _buffer.ReadUTF8Array();
  183. packageBundle.ReferenceIDs = _buffer.ReadInt32Array();
  184. Manifest.BundleList.Add(packageBundle);
  185. packageBundle.ParseBundle(Manifest.PackageName, Manifest.OutputNameStyle);
  186. Manifest.BundleDic.Add(packageBundle.BundleName, packageBundle);
  187. _packageBundleCount--;
  188. Progress = 1f - _packageBundleCount / _progressTotalValue;
  189. if (OperationSystem.IsBusy)
  190. break;
  191. }
  192. if (_packageBundleCount <= 0)
  193. {
  194. _steps = ESteps.Done;
  195. Status = EOperationStatus.Succeed;
  196. }
  197. }
  198. }
  199. catch (System.Exception e)
  200. {
  201. Manifest = null;
  202. _steps = ESteps.Done;
  203. Status = EOperationStatus.Failed;
  204. Error = e.Message;
  205. }
  206. }
  207. }
  208. }