diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs
index d72b0dd9..7ca0723b 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs
@@ -248,27 +248,6 @@ namespace TEngine
/// 资源对象集合。
UniTask> LoadAssetsByTagAsync(string assetTag) where T : UnityEngine.Object;
- ///
- /// 异步加载场景。
- ///
- /// 场景的定位地址。
- /// 场景加载模式。
- /// 加载完毕时是否主动挂起。
- /// 优先级。
- /// 异步加载场景句柄。
- SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100);
-
- ///
- /// 异步加载场景.
- ///
- /// 场景的资源信息。
- /// 场景加载模式。
- /// 加载完毕时是否主动挂起。
- /// 优先级。
- /// 异步加载场景句柄。
- SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false,
- int priority = 100);
-
///
/// 异步加载资源。
///
@@ -325,17 +304,5 @@ namespace TEngine
/// 资源实例类型。
/// 原生文件资源实例。
UniTask LoadAllSubAssetAsync(string location, CancellationToken cancellationToken = default) where T : Object;
-
- ///
- /// 异步加载场景。
- ///
- /// 场景的定位地址。
- /// 取消操作Token。
- /// 场景加载模式。
- /// 加载完毕时是否主动激活。
- /// 优先级。
- /// 场景资源实例。
- UniTask LoadSceneAsyncByUniTask(string location, CancellationToken cancellationToken = default, LoadSceneMode sceneMode = LoadSceneMode.Single,
- bool activateOnLoad = true, int priority = 100);
}
}
\ No newline at end of file
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs
index dc7132f5..548a4dc3 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs
@@ -726,35 +726,6 @@ namespace TEngine
return assetObjects;
}
- ///
- /// 异步加载场景。
- ///
- /// 场景的定位地址。
- /// 场景加载模式。
- /// 加载完毕时是否主动挂起。
- /// 加载优先级。
- /// 异步加载场景句柄。
- public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false,
- int priority = 100)
- {
- return YooAssets.LoadSceneAsync(location, sceneMode, suspendLoad, priority);
- }
-
- ///
- /// 异步加载场景。
- ///
- /// 场景的资源信息。
- /// 场景加载模式。
- /// 加载完毕时是否主动挂起。
- /// 加载优先级。
- /// 异步加载场景句柄。
- public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false,
- int priority = 100)
- {
- return YooAssets.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority);
- }
-
-
///
/// 异步加载资源实例。
///
@@ -910,26 +881,6 @@ namespace TEngine
return cancelOrFailed ? null : handle.GetSubAssetObjects();
}
-
- ///
- /// 异步加载场景。
- ///
- /// 场景的定位地址。
- /// 取消操作Token。
- /// 场景加载模式。
- /// 加载完毕时是否主动激活。
- /// 加载优先级。
- /// 场景资源实例。
- public async UniTask LoadSceneAsyncByUniTask(string location, CancellationToken cancellationToken = default,
- LoadSceneMode sceneMode = LoadSceneMode.Single,
- bool activateOnLoad = true, int priority = 100)
- {
- SceneOperationHandle handle = YooAssets.LoadSceneAsync(location, sceneMode, activateOnLoad, priority);
-
- bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken).SuppressCancellationThrow();
-
- return cancelOrFailed ? default : handle.SceneObject;
- }
}
///
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs
index 1e729861..ebaf84d6 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs
@@ -584,34 +584,6 @@ namespace TEngine
return await m_ResourceManager.LoadAssetsByTagAsync(assetTag);
}
- ///
- /// 异步加载场景。
- ///
- /// 场景的定位地址
- /// 场景加载模式
- /// 加载完毕时是否主动挂起
- /// 优先级
- /// 异步加载场景句柄。
- public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false,
- int priority = 100)
- {
- return m_ResourceManager.LoadSceneAsync(location, sceneMode, suspendLoad, priority);
- }
-
- ///
- /// 异步加载场景
- ///
- /// 场景的资源信息
- /// 场景加载模式
- /// 加载完毕时是否主动挂起
- /// 优先级
- /// 异步加载场景句柄。
- public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false,
- int priority = 100)
- {
- return m_ResourceManager.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority);
- }
-
///
/// 异步加载资源。
///
@@ -686,20 +658,5 @@ namespace TEngine
{
return await m_ResourceManager.LoadAllSubAssetAsync(location, cancellationToken);
}
-
- ///
- /// 异步加载场景。
- ///
- /// 场景的定位地址。
- /// 取消操作Token。
- /// 场景加载模式。
- /// 加载完毕时是否主动激活。
- /// 优先级。
- /// 场景资源实例。
- public async UniTask LoadSceneAsyncByUniTask(string location, CancellationToken cancellationToken = default,
- LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100)
- {
- return await m_ResourceManager.LoadSceneAsyncByUniTask(location, cancellationToken, sceneMode, activateOnLoad, priority);
- }
}
}
\ No newline at end of file
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/ISceneModule.cs b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/ISceneModule.cs
index bbad129e..ef94bb23 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/ISceneModule.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/ISceneModule.cs
@@ -20,8 +20,14 @@ namespace TEngine
/// 优先级
/// 加载回调。
/// 加载主场景是否回收垃圾。
- public void LoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100,
- Action callBack = null, bool gcCollect = true);
+ /// 加载进度回调。
+ public SceneOperationHandle LoadScene(string location,
+ LoadSceneMode sceneMode = LoadSceneMode.Single,
+ bool suspendLoad = false,
+ int priority = 100,
+ Action callBack = null,
+ bool gcCollect = true,
+ Action progressCallBack = null);
///
/// 激活场景(当同时存在多个场景时用于切换激活场景)。
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModule.cs b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModule.cs
index 11329d48..8b2d9f6a 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModule.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModule.cs
@@ -42,10 +42,11 @@ namespace TEngine
/// 优先级
/// 加载回调。
/// 加载主场景是否回收垃圾。
- public void LoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100,
- Action callBack = null, bool gcCollect = true)
+ /// 加载进度回调。
+ public SceneOperationHandle LoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100,
+ Action callBack = null, bool gcCollect = true, Action progressCallBack = null)
{
- _sceneModule.LoadScene(location, sceneMode, suspendLoad, priority, callBack, gcCollect);
+ return _sceneModule.LoadScene(location, sceneMode, suspendLoad, priority, callBack, gcCollect, progressCallBack);
}
///
@@ -56,10 +57,11 @@ namespace TEngine
/// 优先级
/// 加载回调。
/// 加载主场景是否回收垃圾。
- public void LoadSubScene(string location, bool suspendLoad = false, int priority = 100,
- Action callBack = null, bool gcCollect = true)
+ /// 加载进度回调。
+ public SceneOperationHandle LoadSubScene(string location, bool suspendLoad = false, int priority = 100,
+ Action callBack = null, bool gcCollect = true, Action progressCallBack = null)
{
- _sceneModule.LoadScene(location, LoadSceneMode.Additive, suspendLoad, priority, callBack, gcCollect);
+ return _sceneModule.LoadScene(location, LoadSceneMode.Additive, suspendLoad, priority, callBack, gcCollect, progressCallBack);
}
///
diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModuleImp.cs b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModuleImp.cs
index 8be05993..2cff1a76 100644
--- a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModuleImp.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModuleImp.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
using UnityEngine.SceneManagement;
using YooAsset;
@@ -8,7 +9,7 @@ namespace TEngine
///
/// 场景管理器。
///
- internal class SceneModuleImp : ModuleImp,ISceneModule
+ internal class SceneModuleImp : ModuleImp, ISceneModule
{
private string _currentMainSceneName = string.Empty;
@@ -40,40 +41,83 @@ namespace TEngine
///
/// 加载场景。
///
- /// 场景的定位地址
+ /// 场景的定位地址R
/// 场景加载模式
/// 加载完毕时是否主动挂起
/// 优先级
/// 加载回调。
/// 加载主场景是否回收垃圾。
- public void LoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100, Action callBack = null,bool gcCollect = true)
+ /// 加载进度回调。
+ public SceneOperationHandle LoadScene(string location,
+ LoadSceneMode sceneMode = LoadSceneMode.Single,
+ bool suspendLoad = false,
+ int priority = 100,
+ Action callBack = null,
+ bool gcCollect = true,
+ Action progressCallBack = null)
{
if (sceneMode == LoadSceneMode.Additive)
{
- if (_subScenes.ContainsKey(location))
+ if (_subScenes.TryGetValue(location, out SceneOperationHandle subScene))
{
Log.Warning($"Could not load subScene while already loaded. Scene: {location}");
- return;
+ return subScene;
}
- var subScene = GameModule.Resource.LoadSceneAsync(location, sceneMode, suspendLoad, priority);
+ subScene = YooAssets.LoadSceneAsync(location, sceneMode, suspendLoad, priority);
if (callBack != null)
{
subScene.Completed += callBack;
}
+
+ if (progressCallBack != null)
+ {
+ InvokeProgress(subScene, progressCallBack).Forget();
+ }
_subScenes.Add(location, subScene);
+
+ return subScene;
}
- else if(sceneMode == LoadSceneMode.Single)
+ else
{
+ if (_currentMainScene is { IsDone: false })
+ {
+ Log.Warning($"Could not load MainScene while loading. CurrentMainScene: {_currentMainSceneName}.");
+ return null;
+ }
+
_currentMainSceneName = location;
- _currentMainScene = GameModule.Resource.LoadSceneAsync(location, sceneMode, suspendLoad, priority);
+ _currentMainScene = YooAssets.LoadSceneAsync(location, sceneMode, suspendLoad, priority);
if (callBack != null)
{
_currentMainScene.Completed += callBack;
}
+
+ if (progressCallBack != null)
+ {
+ InvokeProgress(_currentMainScene, progressCallBack).Forget();
+ }
+
GameModule.Resource.ForceUnloadUnusedAssets(gcCollect);
+
+ return _currentMainScene;
+ }
+ }
+
+ private async UniTaskVoid InvokeProgress(SceneOperationHandle sceneOperationHandle,Action progress)
+ {
+ if (sceneOperationHandle == null)
+ {
+ return;
+ }
+
+ while (!sceneOperationHandle.IsDone)
+ {
+ await UniTask.Yield();
+
+ progress?.Invoke(sceneOperationHandle.Progress);
}
}