diff --git a/Assets/YooAsset/Runtime/ResourceManager/Handle/SceneHandle.cs b/Assets/YooAsset/Runtime/ResourceManager/Handle/SceneHandle.cs index fcca55f4..0e054b4d 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Handle/SceneHandle.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Handle/SceneHandle.cs @@ -37,6 +37,16 @@ namespace YooAsset } } + /// + /// 等待异步执行完毕 + /// + internal void WaitForAsyncComplete() + { + if (IsValidWithWarning == false) + return; + Provider.WaitForAsyncComplete(); + } + /// /// 场景名称 /// @@ -171,5 +181,7 @@ namespace YooAsset return operation; } } + + } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs index 97573557..96d51578 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/BundledSceneProvider.cs @@ -60,40 +60,60 @@ namespace YooAsset // 2. 加载场景 if (_steps == ESteps.Loading) { - // 注意:如果场景不存在则返回NULL - _asyncOperation = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode); - if (_asyncOperation != null) + if (IsWaitForAsyncComplete || IsForceDestroyComplete) { - _asyncOperation.allowSceneActivation = !_suspendLoad; - _asyncOperation.priority = 100; - SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); - _steps = ESteps.Checking; + LoadSceneParameters parameters = new LoadSceneParameters(SceneMode); + SceneObject = SceneManager.LoadScene(MainAssetInfo.AssetPath, parameters); } else { - string error = $"Failed to load scene : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); + // 注意:如果场景不存在异步加载方法返回NULL + // 注意:即使是异步加载也要在当帧获取到场景对象 + _asyncOperation = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode); + if (_asyncOperation != null) + { + _asyncOperation.allowSceneActivation = !_suspendLoad; + _asyncOperation.priority = 100; + SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); + _steps = ESteps.Checking; + } + else + { + string error = $"Failed to load scene : {MainAssetInfo.AssetPath}"; + YooLogger.Error(error); + InvokeCompletion(error, EOperationStatus.Failed); + } } } // 3. 检测加载结果 if (_steps == ESteps.Checking) { - Progress = _asyncOperation.progress; - if (_asyncOperation.isDone) + if (_asyncOperation != null) { - if (SceneObject.IsValid()) + if (IsWaitForAsyncComplete || IsForceDestroyComplete) { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); + // 场景加载无法强制异步转同步 + YooLogger.Error("The scene is loading asyn !"); } else { - string error = $"The load scene is invalid : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); + Progress = _asyncOperation.progress; + if (_asyncOperation.isDone == false) + return; } } + + if (SceneObject.IsValid()) + { + InvokeCompletion(string.Empty, EOperationStatus.Succeed); + } + else + { + string error = $"The loaded scene is invalid : {MainAssetInfo.AssetPath}"; + YooLogger.Error(error); + InvokeCompletion(error, EOperationStatus.Failed); + } } } diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs index 8173b14c..f12975a9 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/DatabaseSceneProvider.cs @@ -57,41 +57,59 @@ namespace YooAsset // 2. 加载资源对象 if (_steps == ESteps.Loading) { - LoadSceneParameters loadSceneParameters = new LoadSceneParameters(); - loadSceneParameters.loadSceneMode = SceneMode; - _asyncOperation = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters); - if (_asyncOperation != null) + if (IsWaitForAsyncComplete || IsForceDestroyComplete) { - _asyncOperation.allowSceneActivation = !_suspendLoad; - _asyncOperation.priority = 100; - SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); - _steps = ESteps.Checking; + LoadSceneParameters loadSceneParameters = new LoadSceneParameters(SceneMode); + SceneObject = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters); } else { - string error = $"Failed to load scene : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); + LoadSceneParameters loadSceneParameters = new LoadSceneParameters(SceneMode); + _asyncOperation = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters); + if (_asyncOperation != null) + { + _asyncOperation.allowSceneActivation = !_suspendLoad; + _asyncOperation.priority = 100; + SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); + _steps = ESteps.Checking; + } + else + { + string error = $"Failed to load scene : {MainAssetInfo.AssetPath}"; + YooLogger.Error(error); + InvokeCompletion(error, EOperationStatus.Failed); + } } } // 3. 检测加载结果 if (_steps == ESteps.Checking) { - Progress = _asyncOperation.progress; - if (_asyncOperation.isDone) + if (_asyncOperation != null) { - if (SceneObject.IsValid()) + if (IsWaitForAsyncComplete || IsForceDestroyComplete) { - InvokeCompletion(string.Empty, EOperationStatus.Succeed); + // 场景加载无法强制异步转同步 + YooLogger.Error("The scene is loading asyn !"); } else { - string error = $"The loaded scene is invalid : {MainAssetInfo.AssetPath}"; - YooLogger.Error(error); - InvokeCompletion(error, EOperationStatus.Failed); + Progress = _asyncOperation.progress; + if (_asyncOperation.isDone == false) + return; } } + + if (SceneObject.IsValid()) + { + InvokeCompletion(string.Empty, EOperationStatus.Succeed); + } + else + { + string error = $"The loaded scene is invalid : {MainAssetInfo.AssetPath}"; + YooLogger.Error(error); + InvokeCompletion(error, EOperationStatus.Failed); + } } #endif } diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs b/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs index 2442eb63..301591fa 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs @@ -419,7 +419,7 @@ namespace YooAsset public GetAllCacheFileInfosOperation GetAllCacheFileInfosAsync(string packageVersion) { DebugCheckInitialize(); - + var operation = new GetAllCacheFileInfosOperation(_persistentMgr, _cacheMgr, packageVersion); OperationSystem.StartOperation(PackageName, operation); return operation; @@ -602,6 +602,29 @@ namespace YooAsset #endregion #region 场景加载 + /// + /// 同步加载场景 + /// + /// 场景的定位地址 + /// 场景加载模式 + public SceneHandle LoadSceneSync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single) + { + DebugCheckInitialize(); + AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null); + return LoadSceneInternal(assetInfo, true, sceneMode, false, 0); + } + + /// + /// 同步加载场景 + /// + /// 场景的资源信息 + /// 场景加载模式 + public SceneHandle LoadSceneSync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single) + { + DebugCheckInitialize(); + return LoadSceneInternal(assetInfo, true, sceneMode, false, 0); + } + /// /// 异步加载场景 /// @@ -613,8 +636,7 @@ namespace YooAsset { DebugCheckInitialize(); AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null); - var handle = _resourceMgr.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority); - return handle; + return LoadSceneInternal(assetInfo, false, sceneMode, suspendLoad, priority); } /// @@ -627,7 +649,16 @@ namespace YooAsset public SceneHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, uint priority = 0) { DebugCheckInitialize(); + return LoadSceneInternal(assetInfo, false, sceneMode, suspendLoad, priority); + } + + private SceneHandle LoadSceneInternal(AssetInfo assetInfo, bool waitForAsyncComplete, LoadSceneMode sceneMode, bool suspendLoad, uint priority) + { + DebugCheckAssetLoadMethod(nameof(LoadAssetAsync)); + DebugCheckAssetLoadType(assetInfo.AssetType); var handle = _resourceMgr.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority); + if (waitForAsyncComplete) + handle.WaitForAsyncComplete(); return handle; } #endregion