DatabaseSceneProvider.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using UnityEngine;
  2. using UnityEngine.SceneManagement;
  3. namespace YooAsset
  4. {
  5. internal sealed class DatabaseSceneProvider : ProviderBase
  6. {
  7. public readonly LoadSceneMode SceneMode;
  8. private readonly bool _activateOnLoad;
  9. private readonly int _priority;
  10. private AsyncOperation _asyncOp;
  11. public override float Progress
  12. {
  13. get
  14. {
  15. if (_asyncOp == null)
  16. return 0;
  17. return _asyncOp.progress;
  18. }
  19. }
  20. public DatabaseSceneProvider(string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad, int priority) : base(providerGUID, assetInfo)
  21. {
  22. SceneMode = sceneMode;
  23. _activateOnLoad = activateOnLoad;
  24. _priority = priority;
  25. }
  26. public override void Update()
  27. {
  28. #if UNITY_EDITOR
  29. if (IsDone)
  30. return;
  31. if (Status == EStatus.None)
  32. {
  33. Status = EStatus.Loading;
  34. }
  35. // 1. 加载资源对象
  36. if (Status == EStatus.Loading)
  37. {
  38. LoadSceneParameters loadSceneParameters = new LoadSceneParameters();
  39. loadSceneParameters.loadSceneMode = SceneMode;
  40. _asyncOp = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters);
  41. if (_asyncOp != null)
  42. {
  43. _asyncOp.allowSceneActivation = true;
  44. _asyncOp.priority = _priority;
  45. SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);
  46. Status = EStatus.Checking;
  47. }
  48. else
  49. {
  50. Status = EStatus.Fail;
  51. LastError = $"Failed to load scene : {MainAssetInfo.AssetPath}";
  52. YooLogger.Error(LastError);
  53. InvokeCompletion();
  54. }
  55. }
  56. // 2. 检测加载结果
  57. if (Status == EStatus.Checking)
  58. {
  59. if (_asyncOp.isDone)
  60. {
  61. if (SceneObject.IsValid() && _activateOnLoad)
  62. SceneManager.SetActiveScene(SceneObject);
  63. Status = SceneObject.IsValid() ? EStatus.Success : EStatus.Fail;
  64. if (Status == EStatus.Fail)
  65. {
  66. LastError = $"The loaded scene is invalid : {MainAssetInfo.AssetPath}";
  67. YooLogger.Error(LastError);
  68. }
  69. InvokeCompletion();
  70. }
  71. }
  72. #endif
  73. }
  74. }
  75. }