UnloadSceneOperation.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using UnityEngine;
  2. using UnityEngine.SceneManagement;
  3. namespace YooAsset
  4. {
  5. /// <summary>
  6. /// 场景卸载异步操作类
  7. /// </summary>
  8. public sealed class UnloadSceneOperation : AsyncOperationBase
  9. {
  10. private enum ESteps
  11. {
  12. None,
  13. CheckError,
  14. PrepareDone,
  15. UnLoadScene,
  16. Checking,
  17. Done,
  18. }
  19. private ESteps _steps = ESteps.None;
  20. private readonly string _error;
  21. private readonly ProviderBase _provider;
  22. private AsyncOperation _asyncOp;
  23. internal UnloadSceneOperation(string error)
  24. {
  25. _error = error;
  26. }
  27. internal UnloadSceneOperation(ProviderBase provider)
  28. {
  29. _error = null;
  30. _provider = provider;
  31. }
  32. internal override void InternalOnStart()
  33. {
  34. _steps = ESteps.CheckError;
  35. }
  36. internal override void InternalOnUpdate()
  37. {
  38. if (_steps == ESteps.None || _steps == ESteps.Done)
  39. return;
  40. if (_steps == ESteps.CheckError)
  41. {
  42. if (string.IsNullOrEmpty(_error) == false)
  43. {
  44. _steps = ESteps.Done;
  45. Status = EOperationStatus.Failed;
  46. Error = _error;
  47. return;
  48. }
  49. _steps = ESteps.PrepareDone;
  50. }
  51. if (_steps == ESteps.PrepareDone)
  52. {
  53. if (_provider.IsDone == false)
  54. return;
  55. if (_provider.SceneObject.IsValid() == false)
  56. {
  57. _steps = ESteps.Done;
  58. Status = EOperationStatus.Failed;
  59. Error = "Scene is invalid !";
  60. return;
  61. }
  62. if (_provider.SceneObject.isLoaded == false)
  63. {
  64. _steps = ESteps.Done;
  65. Status = EOperationStatus.Failed;
  66. Error = "Scene is not loaded !";
  67. return;
  68. }
  69. _steps = ESteps.UnLoadScene;
  70. }
  71. if (_steps == ESteps.UnLoadScene)
  72. {
  73. _asyncOp = SceneManager.UnloadSceneAsync(_provider.SceneObject);
  74. _provider.ResourceMgr.UnloadSubScene(_provider.SceneName);
  75. _provider.ResourceMgr.TryUnloadUnusedAsset(_provider.MainAssetInfo);
  76. _steps = ESteps.Checking;
  77. }
  78. if (_steps == ESteps.Checking)
  79. {
  80. Progress = _asyncOp.progress;
  81. if (_asyncOp.isDone == false)
  82. return;
  83. _steps = ESteps.Done;
  84. Status = EOperationStatus.Succeed;
  85. }
  86. }
  87. }
  88. }