SceneOperationHandle.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using UnityEngine.SceneManagement;
  2. namespace YooAsset
  3. {
  4. public class SceneOperationHandle : OperationHandleBase
  5. {
  6. private System.Action<SceneOperationHandle> _callback;
  7. internal SceneOperationHandle(ProviderBase provider) : base(provider)
  8. {
  9. }
  10. internal override void InvokeCallback()
  11. {
  12. _callback?.Invoke(this);
  13. }
  14. /// <summary>
  15. /// 完成委托
  16. /// </summary>
  17. public event System.Action<SceneOperationHandle> Completed
  18. {
  19. add
  20. {
  21. if (IsValid == false)
  22. throw new System.Exception($"{nameof(SceneOperationHandle)} is invalid");
  23. if (Provider.IsDone)
  24. value.Invoke(this);
  25. else
  26. _callback += value;
  27. }
  28. remove
  29. {
  30. if (IsValid == false)
  31. throw new System.Exception($"{nameof(SceneOperationHandle)} is invalid");
  32. _callback -= value;
  33. }
  34. }
  35. /// <summary>
  36. /// 场景对象
  37. /// </summary>
  38. public Scene SceneObject
  39. {
  40. get
  41. {
  42. if (IsValid == false)
  43. return new Scene();
  44. return Provider.SceneObject;
  45. }
  46. }
  47. /// <summary>
  48. /// 激活场景
  49. /// </summary>
  50. public bool ActivateScene()
  51. {
  52. if (IsValid == false)
  53. return false;
  54. if (SceneObject.IsValid() && SceneObject.isLoaded)
  55. {
  56. return SceneManager.SetActiveScene(SceneObject);
  57. }
  58. else
  59. {
  60. YooLogger.Warning($"Scene is invalid or not loaded : {SceneObject.name}");
  61. return false;
  62. }
  63. }
  64. /// <summary>
  65. /// 是否为主场景
  66. /// </summary>
  67. public bool IsMainScene()
  68. {
  69. if (IsValid == false)
  70. return false;
  71. if (Provider is DatabaseSceneProvider)
  72. {
  73. var temp = Provider as DatabaseSceneProvider;
  74. return temp.SceneMode == LoadSceneMode.Single;
  75. }
  76. else if (Provider is BundledSceneProvider)
  77. {
  78. var temp = Provider as BundledSceneProvider;
  79. return temp.SceneMode == LoadSceneMode.Single;
  80. }
  81. else
  82. {
  83. throw new System.NotImplementedException();
  84. }
  85. }
  86. /// <summary>
  87. /// 异步卸载子场景
  88. /// </summary>
  89. public UnloadSceneOperation UnloadAsync()
  90. {
  91. // 如果句柄无效
  92. if (IsValid == false)
  93. {
  94. string error = $"{nameof(SceneOperationHandle)} is invalid.";
  95. var operation = new UnloadSceneOperation(error);
  96. OperationSystem.StartOperation(operation);
  97. return operation;
  98. }
  99. // 如果是主场景
  100. if (IsMainScene())
  101. {
  102. string error = $"Cannot unload main scene. Use {nameof(YooAssets.LoadSceneAsync)} method to change the main scene !";
  103. YooLogger.Error(error);
  104. var operation = new UnloadSceneOperation(error);
  105. OperationSystem.StartOperation(operation);
  106. return operation;
  107. }
  108. // 卸载子场景
  109. Scene sceneObject = SceneObject;
  110. AssetSystem.UnloadSubScene(Provider);
  111. {
  112. var operation = new UnloadSceneOperation(sceneObject);
  113. OperationSystem.StartOperation(operation);
  114. return operation;
  115. }
  116. }
  117. }
  118. }