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); } }