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