InitializationOperation.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. namespace YooAsset
  4. {
  5. public class InitializationOperation : AsyncOperationBase
  6. {
  7. private enum ESteps
  8. {
  9. None,
  10. Prepare,
  11. ClearOldFileSystem,
  12. InitFileSystem,
  13. CheckInitResult,
  14. Done,
  15. }
  16. private readonly PlayModeImpl _impl;
  17. private readonly List<FileSystemParameters> _parametersList;
  18. private List<FileSystemParameters> _cloneList;
  19. private FSInitializeFileSystemOperation _initFileSystemOp;
  20. private ESteps _steps = ESteps.None;
  21. internal InitializationOperation(PlayModeImpl impl, List<FileSystemParameters> parametersList)
  22. {
  23. _impl = impl;
  24. _parametersList = parametersList;
  25. }
  26. internal override void InternalStart()
  27. {
  28. _steps = ESteps.Prepare;
  29. }
  30. internal override void InternalUpdate()
  31. {
  32. if (_steps == ESteps.None || _steps == ESteps.Done)
  33. return;
  34. if (_steps == ESteps.Prepare)
  35. {
  36. if (_parametersList == null || _parametersList.Count == 0)
  37. {
  38. _steps = ESteps.Done;
  39. Status = EOperationStatus.Failed;
  40. Error = "The file system parameters is empty !";
  41. return;
  42. }
  43. foreach (var fileSystemParam in _parametersList)
  44. {
  45. if (fileSystemParam == null)
  46. {
  47. _steps = ESteps.Done;
  48. Status = EOperationStatus.Failed;
  49. Error = "An empty object exists in the list!";
  50. return;
  51. }
  52. }
  53. _cloneList = _parametersList.ToList();
  54. _steps = ESteps.ClearOldFileSystem;
  55. }
  56. if (_steps == ESteps.ClearOldFileSystem)
  57. {
  58. // 注意:初始化失败后可能会残存一些旧的文件系统!
  59. foreach (var fileSystem in _impl.FileSystems)
  60. {
  61. fileSystem.OnDestroy();
  62. }
  63. _impl.FileSystems.Clear();
  64. _steps = ESteps.InitFileSystem;
  65. }
  66. if (_steps == ESteps.InitFileSystem)
  67. {
  68. if (_cloneList.Count == 0)
  69. {
  70. _steps = ESteps.Done;
  71. Status = EOperationStatus.Succeed;
  72. }
  73. else
  74. {
  75. var fileSystemParams = _cloneList[0];
  76. _cloneList.RemoveAt(0);
  77. IFileSystem fileSystemInstance = fileSystemParams.CreateFileSystem(_impl.PackageName);
  78. if (fileSystemInstance == null)
  79. {
  80. _steps = ESteps.Done;
  81. Status = EOperationStatus.Failed;
  82. Error = "Failed to create file system instance !";
  83. return;
  84. }
  85. _impl.FileSystems.Add(fileSystemInstance);
  86. _initFileSystemOp = fileSystemInstance.InitializeFileSystemAsync();
  87. _initFileSystemOp.StartOperation();
  88. AddChildOperation(_initFileSystemOp);
  89. _steps = ESteps.CheckInitResult;
  90. }
  91. }
  92. if (_steps == ESteps.CheckInitResult)
  93. {
  94. _initFileSystemOp.UpdateOperation();
  95. Progress = _initFileSystemOp.Progress;
  96. if (_initFileSystemOp.IsDone == false)
  97. return;
  98. if (_initFileSystemOp.Status == EOperationStatus.Succeed)
  99. {
  100. _steps = ESteps.InitFileSystem;
  101. }
  102. else
  103. {
  104. _steps = ESteps.Done;
  105. Status = EOperationStatus.Failed;
  106. Error = _initFileSystemOp.Error;
  107. return;
  108. }
  109. }
  110. }
  111. internal override string InternalGetDesc()
  112. {
  113. return $"PlayMode : {_impl.PlayMode}";
  114. }
  115. }
  116. }